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

时间:2016-11-08 14:42:42

标签: python loops dictionary

我有两本词典。一个有chapter_id和book_id:{99: 7358, 852: 7358, 456: 7358}。这里只有一本书作为例子,但有很多。另一个是相同的chapter_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。我知道如何通过循环两个词典(它们曾经是列表)来做到这一点。但这需要很长时间。这就是为什么他们现在是字典,我想我可以只用一个循环来管理所有章节。但在我的脑海里,我总是回到书本和章节的循环上。任何想法都非常感谢!我将在文件中写入最终结果,因此如果它是嵌套字典或其他内容则不是很重要。或者至少我是这么认为的。

3 个答案:

答案 0 :(得分:2)

您可以随时遍历字典键,因为两个字典中都显示相同的键:

for chapter_id in dict1:
    book_id = dict1[chapter_id]
    chapter_info = dict2[chapter_id]

答案 1 :(得分:2)

如果您愿意使用其他软件包,那么您可能希望查看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)

答案 2 :(得分:1)

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])

您只需要遍历章节。您可以使用显式附加替换append_all函数,但这样做似乎很难看。我很惊讶那里不是一种方法,但可能只是因为我错过了一种在这里使用zip的聪明方法。