[英]creating lists from nested dictionaries
我是編碼新手,我正在嘗試從以下嵌套字典中提取 2 個列表:
dict : {'player2': {'player': 'player2', 'firstname': 'Ross', 'lastname': 'Estrada'}, 'player3': {'player': 'player3', 'firstname': 'Melvin', 'lastname': 'Graves'}, 'player0': {'player': 'player0', 'firstname': 'Alfredo', 'lastname': 'Hopkins'}, 'player1': {'player': 'player1', 'firstname': 'Jay', 'lastname': 'Ramos'}, 'player6': {'player': 'player6', 'firstname': 'Claudia', 'lastname': 'Brown'}, 'player7': {'player': 'player7', 'firstname': 'Ben', 'lastname': 'Carson'}, 'player4': {'player': 'player4', 'firstname': 'Virginia', 'lastname': 'Harmon'}, 'player5': {'player': 'player5', 'firstname': 'Caleb', 'lastname': 'Reese'}, 'player8': {'player': 'player8', 'firstname': 'Olivia', 'lastname': 'Olson'}, 'player9': {'player': 'player9', 'firstname': 'Amy', 'lastname': 'Valdez'}}
第一個列表應該包含所有的名字,而第二個列表應該包含所有的第二個名字。
問題是我不知道用什么鍵來發出所有外部鍵的信號,而不僅僅是一個。
因此,例如我知道dict["player2"]["firstname"]
將返回 player2 的名字,但是我如何編寫它以一次提取所有名字。
感謝您的幫助!
>>> list(zip(*map(operator.itemgetter('firstname', 'lastname'), D.values())))
[('Ross', 'Melvin', 'Alfredo', 'Jay', 'Claudia', 'Ben', 'Virginia', 'Caleb', 'Olivia', 'Amy'), ('Estrada', 'Graves', 'Hopkins', 'Ramos', 'Brown', 'Carson', 'Harmon', 'Reese', 'Olson', 'Valdez')]
>>> fnames, lnames = zip(*map(operator.itemgetter('firstname', 'lastname'), D.values()))
>>> fnames
('Ross', 'Melvin', 'Alfredo', 'Jay', 'Claudia', 'Ben', 'Virginia', 'Caleb', 'Olivia', 'Amy')
>>> lnames
('Estrada', 'Graves', 'Hopkins', 'Ramos', 'Brown', 'Carson', 'Harmon', 'Reese', 'Olson', 'Valdez')
您可以使用列表理解並迭代所有外部鍵:
d = {
'player2': {'player': 'player2', 'firstname': 'Ross', 'lastname': 'Estrada'},
'player3': {'player': 'player3', 'firstname': 'Melvin', 'lastname': 'Graves'},
'player0': {'player': 'player0', 'firstname': 'Alfredo', 'lastname': 'Hopkins'},
'player1': {'player': 'player1', 'firstname': 'Jay', 'lastname': 'Ramos'},
'player6': {'player': 'player6', 'firstname': 'Claudia', 'lastname': 'Brown'},
'player7': {'player': 'player7', 'firstname': 'Ben', 'lastname': 'Carson'},
'player4': {'player': 'player4', 'firstname': 'Virginia', 'lastname': 'Harmon'},
'player5': {'player': 'player5', 'firstname': 'Caleb', 'lastname': 'Reese'},
'player8': {'player': 'player8', 'firstname': 'Olivia', 'lastname': 'Olson'},
'player9': {'player': 'player9', 'firstname': 'Amy', 'lastname': 'Valdez'}}
firstNames = [ d[pKey].get('firstname','') for pKey in d]
lastNames = [ d[pKey].get('lastname','') for pKey in d]
print(firstNames)
print(lastNames)
通過使用dict.get(key,default)
您可以避免在內部字典中出現鍵錯誤,以防萬一您查找的鍵不在其中 - 並提供默認值。
請參閱 fe 為什么使用 dict.get(key) 而不是 dict[key]? 有關為什么它很聰明的答案。
for k in dictName
使用for k in dictName
將迭代這個字典的所有可能的鍵,剩下的就是一個簡單的列表理解來生成想要的列表。
那個單線就行
first_names, last_names = zip(*((d[k]['firstname'], d[k]['lastname']) for k in d))
輸出:
>>> first_names
('Virginia', 'Amy', 'Melvin', 'Claudia', 'Jay', 'Alfredo', 'Ross',
'Caleb', 'Ben', 'Olivia')
>>> last_names
('Harmon', 'Valdez', 'Graves', 'Brown', 'Ramos', 'Hopkins', 'Estrada',
'Reese', 'Carson', 'Olson')
注 1:也許您更喜歡dict.get(key)
到dict[key]
,正如 Patrick Artner 所建議的那樣 注 2:這些變量將是元組。 如果需要,將它們轉換為list
。
另一種方法是這樣的(將字典命名為d
而不是dict
,因為dict
是 Python 內置類型和保留關鍵字):
firstNames = list(map(lambda i: d[i]['firstname'], d.keys()))
lastNames = list(map(lambda i: d[i]['lastname'], d.keys()))
print(firstNames)
print(lastNames)
輸出:
['Ross', 'Melvin', 'Alfredo', 'Jay', 'Claudia', 'Ben', 'Virginia', 'Caleb', 'Olivia', 'Amy']
['Estrada', 'Graves', 'Hopkins', 'Ramos', 'Brown', 'Carson', 'Harmon', 'Reese', 'Olson', 'Valdez']
您可以使用zip
和解包:
d = {'player2': {'player': 'player2', 'firstname': 'Ross', 'lastname': 'Estrada'}, 'player3': {'player': 'player3', 'firstname': 'Melvin', 'lastname': 'Graves'}, 'player0': {'player': 'player0', 'firstname': 'Alfredo', 'lastname': 'Hopkins'}, 'player1': {'player': 'player1', 'firstname': 'Jay', 'lastname': 'Ramos'}, 'player6': {'player': 'player6', 'firstname': 'Claudia', 'lastname': 'Brown'}, 'player7': {'player': 'player7', 'firstname': 'Ben', 'lastname': 'Carson'}, 'player4': {'player': 'player4', 'firstname': 'Virginia', 'lastname': 'Harmon'}, 'player5': {'player': 'player5', 'firstname': 'Caleb', 'lastname': 'Reese'}, 'player8': {'player': 'player8', 'firstname': 'Olivia', 'lastname': 'Olson'}, 'player9': {'player': 'player9', 'firstname': 'Amy', 'lastname': 'Valdez'}}
first, last = zip(*[[b['firstname'], b['lastname']] for _, b in d.items()])
輸出:
('Ross', 'Melvin', 'Alfredo', 'Jay', 'Claudia', 'Ben', 'Virginia', 'Caleb', 'Olivia', 'Amy')
('Estrada', 'Graves', 'Hopkins', 'Ramos', 'Brown', 'Carson', 'Harmon', 'Reese', 'Olson', 'Valdez')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.