簡體   English   中英

迭代字典值,這些列表值是用於創建新的字典列表的列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM