Python:按键拆分dict列表

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

如果我在一个列表中有一堆dicts,比如:

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]