有效地将列表合并到字典列表中

时间:2016-04-14 01:46:52

标签: python list dictionary

我有2个列表,我想将它们合并为词典列表。 我的代码:

import pprint

list1 = [1, 2, 3, 4]
list2 = [0, 1, 1, 2]
newlist = []
for i in range(0, len(list1)):
    newdict = {}
    newdict["original"] = list1[i]
    newdict["updated"] = list2[i]
    newlist.append(newdict)
pprint.pprint(newlist)

输出:

[{'original': 1, 'updated': 0},
 {'original': 2, 'updated': 1},
 {'original': 3, 'updated': 1},
 {'original': 4, 'updated': 2}]

有更好或更快的方法吗?

3 个答案:

答案 0 :(得分:12)

您可以zip两个列表,然后使用列表推导,您可以在列表中为每个项目创建字典:

list1=[1,2,3,4]
list2=[0,1,1,2]

new_list = [{'original': v1, 'updated': v2} for v1, v2 in zip(list1, list2)]

print(new_list)

输出:

[{'updated': 0, 'original': 1}, {'updated': 1, 'original': 2}, {'updated': 1, 'original': 3}, {'updated': 2, 'original': 4}]

答案 1 :(得分:0)

您还可以使用列表推导在每个索引上迭代两个列表。因此,如果list1大于list2,这将抛出索引错误。有人知道拉链是否更快?

newlist = [{"original":list1[i],"updated":list2[i]} for i in range(len(list1))]

答案 2 :(得分:0)

idjaw提供的答案以非常Pythonic的方式钉它。有一种使用命名元组的替代方法:

from collections import namedtuple
from itertools import izip
ListCompare = namedtuple('ListCompare', ['original', 'updated'])
L1 = [1,2,3,4]
L2 = [0,1,1,2]
comp = [ListCompare(a, b) for a,b in izip(L1, L2)]
print comp[1].original, comp[1].updated

2 1

如果列表很长,则命名元组应该比字典表现更好(即开销更少)。虽然我提到这个鲜为人知的替代方案。 请注意,此代码适用于Python 2.7,对于Python 3,必须进行微调。