打印两个相关列表

Printing two related lists

提问人:VirreJoj 提问时间:11/9/2023 最后编辑:mozwayVirreJoj 更新时间:11/9/2023 访问量:37

问:

我有一个我无法解决的问题。 我有两个包含相关信息的列表。列表结构如下:

List_a = [(id_nr, date, event), (...)]
List_b = [(id_nr, Item, price), (...), (...)]

List_b中可以有许多项目通过 ID nr 与 List_a中的项目相关联。所以信息可以看起来像这样

List_a = [(1, '2023-01-01', 'Groceries'), (2, '2023-01-02', 'IKEA')]
List_b = [(1, 'Bread', 20), (1, 'Milk', 10), (2, 'Chair', 125), (2, 'Sofa', 230), (2, 'Bed', 340)]

我想要的是让这些打印成这样:

1, 2023-01-01, Groceries
1, Bread, 20
1, Milk, 10
2, 2023-01-02, IKEA
2, Chair, 125
2, Sofa, 230
2, Bed, 340

我尝试过嵌套的for循环,例如:

For a in List_a:
    Print((a[0], a[1], a[2]))
   
    For b in List_b
    Print((b[0], b[1], b[2]))

我也尝试过在代码中使用 while 循环,但它要么导致错误,要么我得到第一个列表的第一项,然后是第二个列表的所有项目,最后是第一个列表的所有项目。

有没有人有解决这个问题的好方法?

python 列表 循环 for 嵌套循环

评论

0赞 mozway 11/9/2023
列表是否按元组中的第一个数字排序?
0赞 VirreJoj 11/10/2023
是的,正确。列表按第一个数字排序。多谢。这确实帮助:)

答:

0赞 mozway 11/9/2023 #1

假设两个列表按元组中的第一个数字排序,并且两个列表之间至少有一个匹配项:

List_a = [(1, '2023-01-01', 'Groceries'), (2, '2023-01-02', 'IKEA')]
List_b = [(1, 'Bread', 20), (1, 'Milk', 10), (2, 'Chair', 125), (2, 'Sofa', 230), (2, 'Bed', 340)]

idx = 0
for tup in List_a:
    print(*tup, sep=', ')
    while idx < len(List_b) and List_b[idx][0] == tup[0]:
        print(*List_b[idx], sep=', ')
        idx += 1

如果 List_b 不一定按 id 排序或分组,则首先在按元组的第一个值索引的字典中收集匹配的元组:

dic_b = {}
for t in List_b:
    dic_b.setdefault(t[0], []).append(t)

idx = 0
for tup in List_a:
    print(*tup, sep=', ')
    for t in dic_b.get(tup[0], []):
        print(*t, sep=', ')

输出:

1, 2023-01-01, Groceries
1, Bread, 20
1, Milk, 10
2, 2023-01-02, IKEA
2, Chair, 125
2, Sofa, 230
2, Bed, 340