在python中在一个循环中迭代两个字典

2024-09-28 22:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两本字典。一个有章节号和书号:{99: 7358, 852: 7358, 456: 7358}。这里只举一本书作为例子,但是有很多。另一个是同一章的id和一些信息:{99: [John Smith, 20, 5], 852: [Clair White, 15, 10], 456: [Daniel Dylan, 25, 10]}。章节ID在所有书籍中都是独一无二的。我必须把它结合起来,让每本书从它包含的所有章节中获取信息。像{7358:[[99,852,456],[John Smith, Claire White, Daniel Dylan],[20,15,25],[5,10,10]]}。我还有一个已经有字典的文件,每本书都有它所有章节的ID。我知道如何通过在两个字典上循环(它们以前是列表)来实现这一点。但这需要很长时间。这就是为什么它们现在都是字典,我想我可以用一个循环来管理所有章节。但在我的脑海里,我总是回到对书籍和章节的循环。任何想法都非常感谢!最后的结果我会写在这个文件中,所以如果它是一个嵌套的字典或其他东西,它不是很重要。或者至少我是这么认为的。在


Tags: 文件信息id字典john例子书籍smith
3条回答

如果两个字典中出现相同的键,则可以始终迭代字典键:

for chapter_id in dict1:
    book_id = dict1[chapter_id]
    chapter_info = dict2[chapter_id]
from collections import defaultdict

def append_all(l, a):
    if len(l) != len(a):
        raise ValueError
    for i in range(len(l)):
        l[i].append(a[i])


final_dict = defaultdict(lambda: [[],[],[],[]])
for chapter, book in d1.items():
    final_dict[book][0].append(chapter)
    append_all(final_dict[book][1:], d2[chapter])

你只需要反复阅读这些章节。您可以用显式的appends替换append_all函数,但这样做似乎很难看。我很惊讶没有这样的方法,但可能只是我错过了一个使用zip的聪明方法。在

如果您愿意使用其他软件包,那么您可能需要查看一下pandas,这将使您能够轻松快速地完成许多事情。下面是一个基于您提供的数据的示例。。。在

import pandas as pd
d1 = {99: 7358, 852: 7358, 456: 7358}
df1 = pd.DataFrame.from_dict(d1, "index")
df1.reset_index(inplace=True)

d2 = {99: ["John Smith", 20, 5], 852: ["Clair White", 15, 10], 456: ["Daniel Dylan", 25, 10]}
df2 = pd.DataFrame.from_dict(d2, "index")
df2.reset_index(inplace=True)

df = df1.merge(df2, left_on="index", right_on="index")
df.columns = ["a", "b", "c", "d", "e"]

# all data for 7358 (ie subsetting)
df[df.b == 7358]
# all names as a list
list(df[df.b == 7358].c)

相关问题 更多 >