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)
一种简单灵活的方法是将您的词典列表"转置"为列表词典.恕我直言,这比创建一堆单独的列表更容易使用.
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兼容.
如果所有字典都有'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, ..)则需要额外的列表。
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |