更新字典列表

时间:2018-01-28 10:54:05

标签: python-3.x

我有以下2个dict列表:

a = [{'id': 1, 'value': '1'}, {'id': 2, 'value': '2'}, {'id': 3, 'value': '3'}]
b = [{'id': 2, 'value': '2.0'}]

我期待第三个列表(或更新列出),以便输出将反映列表中的列表b (compairision将基于 id < / em>的)。因此,在上述情况下,结果将是:

c = [{'id': 1, 'value': '1'}, {'id': 2, 'value': '2.0'}, {'id': 3, 'value': '3'}]

关于如何做到这一点的任何线索,而不是循环遍历列表的传统方式?

3 个答案:

答案 0 :(得分:3)

试试这个

[j if i["id"] == j["id"] else i for i in a for j in b]

输出

  

[{'id':1,'value':'1'},{'id':2,'value':'2.0'},{'id':3,   '价值':'3'}]

答案 1 :(得分:2)

如果你别无选择,只能使用这样笨重的结构,你至少可以尝试尽可能提高效率。

其他答案为您提供二次时间解决方案。但是你可以通过一点预处理将其降低到线性 - 这是一个很大的改进。

b = {d['id'] : d for d in b}
a_new = [b.get(d['id'], d) for d in a]

print(a_new)
[{'id': 1, 'value': '1'}, {'id': 2, 'value': '2.0'}, {'id': 3, 'value': '3'}]

这个想法是将b放入映射的词典中。查找变为恒定时间,为您节省整个循环遍历。

答案 2 :(得分:1)

试试这个: -

a = [{'id': 1, 'value': '1'}, {'id': 2, 'value': '2'}, {'id': 3, 'value': '3'}]
b = [{'id': 2, 'value': '2.0'}]
for i in a:
    for j in b:    
        if i['id'] == j['id']:
            i['value'] = j['value']
print (a) #expected output