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

Joh*_*Doe 3 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'}]
Run Code Online (Sandbox Code Playgroud)

现在我想分割每个键的每个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]
Run Code Online (Sandbox Code Playgroud)

是否可以通过地图实现这一目标?这样我就不必多次调用地图,只需要一次?

name_vals, age_vals = map(lambda ....)
Run Code Online (Sandbox Code Playgroud)

PM *_*ing 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)
Run Code Online (Sandbox Code Playgroud)

产量

{'age': [18, 20], 'name': ['John Doe', 'Jane Doe']}
Run Code Online (Sandbox Code Playgroud)

但是如果你真的想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)
Run Code Online (Sandbox Code Playgroud)

产量

[18, 20] ['John Doe', 'Jane Doe']
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 2,那么调用list包装器map是不必要的,但最好使用它来使您的代码与Python 3兼容.


Wil*_*sem 5

如果所有字典都有'name'and'age'键,并且我们可以使用zip内置函数,我们可以这样做:

from operator import itemgetter

names, ages = zip(*map(itemgetter('name', 'age'), l))
Run Code Online (Sandbox Code Playgroud)

这将产生元组

>>> names
('John Doe', 'Jane Doe')
>>> ages
(18, 20)
Run Code Online (Sandbox Code Playgroud)

如果您需要列表,map(list, ..)则需要额外的列表。