我有一个dicts列表:
>>> adict = {'name': 'John Doe', 'age': 18}
>>> bdict = {'name': 'Jane Doe', 'age': 20}
>>> l = []
>>> l.append(adict)
>>> l.append(bdict)
>>> l
[{'age': 18, 'name': 'John Doe'}, {'age': 20, 'name': 'Jane Doe'}]
现在我想分割每个键的每个dict的值。目前,我就是这样做的:
>>> for i in l:
... name_vals.append(i['name'])
... age_vals.append(i['age'])
...
>>> name_vals
['John Doe', 'Jane Doe']
>>> age_vals
[18, 20]
是否可以通过地图实现这一目标?所以我不必多次调用地图,但只需要一次?
name_vals, age_vals = map(lambda ....)
答案 0 :(得分:6)
一个简单的&这样做的灵活方式是转换"转置"你的词典列表成为列表的词典。恕我直言,这比创建一堆单独的列表更容易使用。
lst = [{'age': 18, 'name': 'John Doe'}, {'age': 20, 'name': 'Jane Doe'}]
out = {}
for d in lst:
for k, v in d.items():
out.setdefault(k, []).append(v)
print(out)
<强>输出强>
{'age': [18, 20], 'name': ['John Doe', 'Jane Doe']}
但如果您真的想使用map
并在此单独列出,则有几个选项。威廉已经表现出一种方式。这是另一个。
from operator import itemgetter
lst = [{'age': 18, 'name': 'John Doe'}, {'age': 20, 'name': 'Jane Doe'}]
keys = 'age', 'name'
age_lst, name_lst = [list(map(itemgetter(k), lst)) for k in keys]
print(age_lst, name_lst)
<强>输出强>
[18, 20] ['John Doe', 'Jane Doe']
如果你正在使用Python 2,那么围绕list
电话的map
包装是不必要的,但是最好用它来制作你的代码与Python 3兼容。
答案 1 :(得分:4)
如果所有词典都包含'name'
和'age'
键,并且我们可以使用zip
内置词,我们可以执行以下操作:
from operator import itemgetter
names, ages = zip(*map(itemgetter('name', 'age'), l))
这将产生元组:
>>> names
('John Doe', 'Jane Doe')
>>> ages
(18, 20)
如果您需要列表,则需要额外的map(list, ..)
。