Python:按键拆分字典列表

3
如果我有一个包含多个字典的列表,例如:
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] 两次),但有没有什么技巧可以在一行内拆分这些数据?

4个回答

2
你可以使用zip技巧:
>>> names, ages = zip(*(d.values() for d in people))
>>> names
('Abe', 'Bob', 'Charles')
>>> ages
(40, 25, 32)

请注意,这仅适用于Python 3.7及更高版本,因为在这些版本中,字典是按插入顺序排序的。

1
你可以使用 zipmap dict.values 将列表转换为字典:
names, ages = zip(*map(dict.values, people))

>>> names
('Abe', 'Bob', 'Charles')
>>> ages
(40, 25, 32)

当然,它们是元组,但通过将列表映射到解压缩结果,这很容易解决。
names, ages = map(list, zip(*map(dict.values, people)))

>>> names
['Abe', 'Bob', 'Charles']
>>> ages
[40, 25, 32]

0
假设您的字典具有相同的结构(相同的键集),则可以使用以下方法按键聚合值:
>>> 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版本(无需有序字典),对于大量的键/变量非常方便。


0

你可以使用列表推导式从字典中提取所需的字段名:

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接