遍历列表中的字典值以创建新的字典列表

时间:2019-03-06 12:34:19

标签: python list dictionary for-loop

我有一本词典,键为“标题”,“作者”,“出版年”,其值是列表:

book_dict= {'Titles': ['Double Play', 'Slow Burn', 'Altman Code'], 'Authors': ['Brown, Dan', 'Hannah, Kristin', 'Neri, Penelope'], 
'Publication Year': [2004, 2003, 2006]}

列表中每个条目的位置彼此对应,因此book_dict['Titles'][0]book_dict['Authors'][0]是有关同一本书的信息。 (注意:这些是书籍和作者的真实名字,但实际上并不对应)

我想创建一个包含这样的字典的列表:

[{"Title":"Double Play","Author":"Brown, Dan", "Publication Year":2004}, 
{"Title":"Slow Burn","Author":"Hannah, Kristin", "Publication Year":2003},
{"Title":"Altman Code","Author":"Neri, Penelope'", "Publication Year":2006}]

到目前为止,我已经尝试过:

for i in range(30):
    for k,v in book_dict.items():
        print({k[i]:v[i]})

但是我得到了这个:

{"Title":"Double Play"}
{"Author":"Brown, Dan"}
{"Publication Year":2004}
{"Title":"Slow Burn"}
{"Author":"Hannah, Kristin"}
{"Publication Year":2003}
{"Title":"Altman Code"}
{"Author":"Neri, Penelope"} 
{"Publication Year":2006}

加上一个IndexError: list index out of range

4 个答案:

答案 0 :(得分:3)

您将不得不对原始字典的值使用zip的某些变体:

>>> [{'Title': t, 'Author': a, 'Publication Year': y} for t, a, y in zip(book_dict['Titles'], book_dict['Authors'], book_dict['Publication Year'])]
[{'Title': 'Double Play', 'Author': 'Brown, Dan', 'Publication Year': 2004}, 
 {'Title': 'Slow Burn', 'Author': 'Hannah, Kristin', 'Publication Year': 2003}, 
 {'Title': 'Altman Code', 'Author': 'Neri, Penelope', 'P
ublication Year': 2006}]

您可能会使用一些实用程序使其更具可读性:

from  operator import itemgetter

items = itemgetter('Titles', 'Authors', 'Publication Year')
[
    {'Title': t, 'Author': a, 'Publication Year': y} 
    for t, a, y in zip(*items(book_dict))
]
# [{'Title': 'Double Play', 'Author': 'Brown, Dan', 'Publication Year': 2004}, 
#  {'Title': 'Slow Burn', 'Author': 'Hannah, Kristin', 'Publication Year': 2003}, 
#  {'Title': 'Altman Code', 'Author': 'Neri, Penelope', 'Publication Year': 2006}]

答案 1 :(得分:3)

一种无需对键进行硬编码的通用方法是,对dict的压缩值进行迭代,并用该zip值压缩dict键,以使用dict构造函数构建子字典:

[dict(zip(book_dict, t)) for t in zip(*book_dict.values())]

这将返回:

[{'Titles': 'Double Play', 'Authors': 'Brown, Dan', 'Publication Year': 2004},
 {'Titles': 'Slow Burn', 'Authors': 'Hannah, Kristin', 'Publication Year': 2003},
 {'Titles': 'Altman Code', 'Authors': 'Neri, Penelope', 'Publication Year': 2006}]

答案 2 :(得分:1)

尝试一下:

[{k : book_dict[k][j] for k in book_dict} for j in range(len(book_dict['Titles']))]

输出

[{'Titles': 'Double Play', 'Authors': 'Brown, Dan', 'Publication Year': 2004}, {'Titles': 'Slow Burn', 'Authors': 'Hannah, Kristin', 'Publication Year': 2003}, {'Titles': 'Altman Code', 'Authors': 'Neri, Penelope', 'Publication Year': 2006}]

答案 3 :(得分:1)

您可以使用zip()逐步访问多个列表,例如

result = []
for title, author, year in zip(book_dict['Titles'], book_dict['Authors'],     
book_dict['Publication Year']):
    result.append({'Title': title, 'Author': author, 'Year': year})

print result