如何在Python map中返回多个值?

时间:2018-01-05 10:49:40

标签: python functional-programming

我有一个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 ....)

2 个答案:

答案 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, ..)