从嵌套字典创建列表

时间:2018-03-28 19:23:06

标签: python python-3.x

新编码,我试图从以下嵌套字典中提取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的名字,但是如何写这个以一次提取所有的名字。

感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可以使用列表推导并迭代所有外键:

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),您可以避免在内部词典中获取键错误,以防一个人拥有您不在其中的键 - 并提供默认值。

见f.e. Why dict.get(key) instead of dict[key]?获取有关其聪明原因的答案。

使用for k in dictName将迭代此词典的整体可能键,其余的是一个简单的列表理解,以生成所需列表。

答案 2 :(得分:1)

那个单行将会做

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:根据Patrick Artner的建议,您可能更喜欢dict.get(key)dict[key] 注2:这些变量将是元组。如果您愿意,请将它们转换为list

答案 3 :(得分:0)

另一种方法是这样做(命名你的字典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']

答案 4 :(得分:0)

您可以使用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')