Python:按键拆分dict列表
如果我在一个列表中有一堆dicts,比如:Python:按键拆分dict列表,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,如果我在一个列表中有一堆dicts,比如: people = [{"name": "Abe", "age": 40}, {"name": "Bob", "age": 25}, {"name": "Charles", "age": 32}] 我想把它分开,让它看起来像 names
people = [{"name": "Abe", "age": 40},
{"name": "Bob", "age": 25},
{"name": "Charles", "age": 32}]
我想把它分开,让它看起来像
names = ["Abe", "Bob", "Charles"]
ages = [40, 25, 32]
我知道我可以做两个单独的列表理解(例如:names=[person[“name”]for person in people
]两次),但是有什么技巧可以将这些数据拆分成一行吗?您可以使用这个技巧:
请注意,这仅适用于Python 3.7及更高版本,因为这些版本中都有字典。您可以使用
zip
和将dict.values
映射到列表中:
names, ages = zip(*map(dict.values, people))
当然,它们是元组,但通过将列表映射到解压缩的结果,就可以很容易地解析它们:
names, ages = map(list, zip(*map(dict.values, people)))
假设您的dicts共享结构(相同的一组键),您可以使用以下方法聚合每个键的值:
>>> import operator
>>> keys = people[0].keys()
>>> getter = operator.itemgetter(*keys)
>>> dict(zip(keys, zip(*map(getter, people))))
{'name': ('Abe', 'Bob', 'Charles'), 'age': (40, 25, 32)}
可以在任何Python中使用(不需要顺序dict),并且对于大量键/变量非常方便。您可以通过列表理解从字典中提取所需的字段名来实现:
people = [{"name": "Abe", "age": 40},
{"name": "Bob", "age": 25},
{"name": "Charles", "age": 32}]
names,ages = ([p[field] for p in people] for field in ("name","age"))
print(names) # ['Abe', 'Bob', 'Charles']
print(ages) # [40, 25, 32]
>>> names
['Abe', 'Bob', 'Charles']
>>> ages
[40, 25, 32]
>>> import operator
>>> keys = people[0].keys()
>>> getter = operator.itemgetter(*keys)
>>> dict(zip(keys, zip(*map(getter, people))))
{'name': ('Abe', 'Bob', 'Charles'), 'age': (40, 25, 32)}
people = [{"name": "Abe", "age": 40},
{"name": "Bob", "age": 25},
{"name": "Charles", "age": 32}]
names,ages = ([p[field] for p in people] for field in ("name","age"))
print(names) # ['Abe', 'Bob', 'Charles']
print(ages) # [40, 25, 32]