[英]Iterating over dictionary values which are lists to create a new list of dictionaries
我有一個字典,其中包含鍵'Title','Author','Publication Year',其值為列表:
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
你將不得不在原始字典的值上使用一些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}]
不需要對密鑰進行硬編碼的通用方法是迭代dict的壓縮值並使用壓縮值壓縮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}]
嘗試這個 :
[{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}]
您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.