zip 2字典列表为1

时间:2013-11-19 13:15:17

标签: python list dictionary zip

我有第一个这样的列表

[{"name":"jon", "age":10}, {"name":"mary", "age":12}]

第二个列表如此

[{"city":"nyc"}, {"city":"la"}]

并希望将它们组合成一个单词列表。假设它们的长度相同。

[{"name":"jon", "age":10, "city":"nyc"}, {"name":"mary", "age":12, "city":"la"}]

谢谢!

3 个答案:

答案 0 :(得分:7)

使用list comprehension

>>> lis1 = [{"name":"jon", "age":10}, {"name":"mary", "age":12}]
>>> lis2 = [{"city":"nyc"}, {"city":"la"}]
>>> [dict(x, **y) for x, y in zip(lis1, lis2)]
[{'city': 'nyc', 'age': 10, 'name': 'jon'}, {'city': 'la', 'age': 12, 'name': 'mary'}]

作为Guido dislikes dict(x, **y),另一个选项是:

>>> [dict(x.items() + y.items()) for x, y in zip(lis1, lis2)]
[{'city': 'nyc', 'age': 10, 'name': 'jon'}, {'city': 'la', 'age': 12, 'name': 'mary'}]

答案 1 :(得分:3)

还简单地说:

for i in xrange(len(x)):
    x[i].update(y[i])

答案 2 :(得分:2)

三种新方式,所有直接变体:

from collections import ChainMap

first  = [{"name":"jon", "age":10}, {"name":"mary", "age":12}]
second = [{"city":"nyc"}, {"city":"la"}]

首先:

map(ChainMap, first, second)
#>>> <map object at 0x7fee1c53ddd0>

请注意,此不会复制对象。如果您需要在实际列表中:

[ChainMap(f, s) for f, s, in zip(first, second)]
#>>> [ChainMap({'name': 'jon', 'age': 10}, {'city': 'nyc'}), ChainMap({'name': 'mary', 'age': 12}, {'city': 'la'})]

如果您需要复制:

[dict(ChainMap(f, s)) for f, s, in zip(first, second)]
#>>> [{'name': 'jon', 'age': 10, 'city': 'nyc'}, {'name': 'mary', 'age': 12, 'city': 'la'}]

老实说,这似乎比dict(first.items() + second.items())更好,而且也很稳定。