迭代两个包含字典的列表,将匹配附加到第三个列表

时间:2013-06-03 08:09:53

标签: python dictionary match

我有两个包含词典的列表:

list105 = [
{'Country': 'Zimbabwe', 'GDP/Pop 2005': 281.0751453319367}
{'Country': 'Zambia', 'GDP/Pop 2005': 654.055392253311}
{'Country': 'Congo (Dem. Rep.)', 'GDP/Pop 2005': 115.37122637190915}
]

list202 = [
{'Country': 'Vietnam', 'GDP/Pop 2002': 633.4709249146734}
{'Country': 'Zambia', 'GDP/Pop 2002': 1198.4556066429468}
{'Country': 'Vanuatu', 'GDP/Pop 2002': 1788.4344216880352}
]

是否可以遍历两个字典列表,匹配“Country”键,并将任一字典中的所有唯一键附加到第三个列表中创建的新字典中?从上面开始,第三个列表将包含:

list2and3 = [
{'Country': 'Zambia', 'GDP/Pop 2005': 654.055392253311, 'GDP/Pop 2002': 1198.4556066429468}
]

我开始使用类似的东西:

list2and3 = []
for line in list105:
    for row in list202:
        if line['Country'] == row['Country']:
            #do something and append to list2and3

3 个答案:

答案 0 :(得分:1)

将第一个列表转换为dict:

d = {x['Country']:x for x in list105}

然后迭代第二个列表并将数据添加到dict:

for item in list202:
    key = item['Country']
    if key in d:
        d[key].update(item)
    else:
        d[key] = item

最后,应用.values()将dict转换回列表:

newlist = d.values()

注意:此数据结构不是最佳的,请考虑重新考虑它。

答案 1 :(得分:0)

from copy import deepcopy
list2and3 = []
for line in list105:
    for row in list202:
        if line['Country'] == row['Country']:
            dic = deepcopy(line) # creates a deepcopy of row, so that the
            dic.update(row)      # update operation doesn't affects the original object
            list2and3.append(dic)

print list2and3

<强>输出:

[{'Country': 'Zambia', 'GDP/Pop 2005': 654.055392253311, 'GDP/Pop 2002': 1198.4556066429468}]

答案 2 :(得分:0)

你可能想要一个没有循环的更好的解决方案。

[x for x in list105 for y in list202 if x['Country'] == y['Country'] and x != y and not x.update(y)]

1列表理解可以引导您回答,但可能不是人性化的。只需选择你喜欢的。