简体   繁体   English

从嵌套字典创建列表

[英]creating lists from nested dictionaries

I am new to coding and I am trying to extract 2 lists from the following nested dictionary:我是编码新手,我正在尝试从以下嵌套字典中提取 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'}}

The first list should contain all the first names, whereas the second list should contain all the second names.第一个列表应该包含所有的名字,而第二个列表应该包含所有的第二个名字。

The problem is that I do not know what key to use to signal all outer keys rather than just one.问题是我不知道用什么键来发出所有外部键的信号,而不仅仅是一个。

So, for example I know dict["player2"]["firstname"] will return the player2's firstname, but how can I write this to extract all the firstnames at once.因此,例如我知道dict["player2"]["firstname"]将返回 player2 的名字,但是我如何编写它以一次提取所有名字。

Thanks for your help!感谢您的帮助!

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

You can use a list comprehension and iterate over all outer keys:您可以使用列表理解并迭代所有外部键:

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)

By using dict.get(key,default) you can avoid getting key-errors on the inner dictionaries in case one has the key you look for not inside it - and provide a default.通过使用dict.get(key,default)您可以避免在内部字典中出现键错误,以防万一您查找的键不在其中 - 并提供默认值。

See fe Why dict.get(key) instead of dict[key]?请参阅 fe 为什么使用 dict.get(key) 而不是 dict[key]? for answers on why its smart.有关为什么它很聪明的答案。

Using for k in dictName will iterate overall possible keys of this dictionary, the rest is a simple list comprehension to generate the wanted lists. for k in dictName使用for k in dictName将迭代这个字典的所有可能的键,剩下的就是一个简单的列表理解来生成想要的列表。

That one-liner will do那个单线就行

first_names, last_names = zip(*((d[k]['firstname'], d[k]['lastname']) for k in d))

Output:输出:

>>> first_names
('Virginia', 'Amy', 'Melvin', 'Claudia', 'Jay', 'Alfredo', 'Ross', 
'Caleb', 'Ben', 'Olivia')
>>> last_names
('Harmon', 'Valdez', 'Graves', 'Brown', 'Ramos', 'Hopkins', 'Estrada', 
'Reese', 'Carson', 'Olson')

Note 1: Maybe you would prefer dict.get(key) to dict[key] , as suggested by Patrick Artner Note 2: Those variables will be tuples.注 1:也许您更喜欢dict.get(key)dict[key] ,正如 Patrick Artner 所建议的那样 注 2:这些变量将是元组。 Convert them to list if you want to.如果需要,将它们转换为list

Another way of doing it is this (naming your dictionary d instead of dict , as dict is a Python built-in type and reserved keyword):另一种方法是这样的(将字典命名为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)

Output:输出:

['Ross', 'Melvin', 'Alfredo', 'Jay', 'Claudia', 'Ben', 'Virginia', 'Caleb', 'Olivia', 'Amy']
['Estrada', 'Graves', 'Hopkins', 'Ramos', 'Brown', 'Carson', 'Harmon', 'Reese', 'Olson', 'Valdez']

You can use zip and unpacking:您可以使用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()])

Output:输出:

('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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM