Python比较不同值的字典

时间:2010-09-22 11:00:18

标签: python

我有2个字典列表,并希望返回具有相同ID但标题不同的项目。即。

list1 = [{'id': 1, 'title': 'title1'}, {'id': 2, 'title': 'title2'}, {'id': 3, 'title': 'title3'}]

list2 = [{'id': 1, 'title': 'title1'}, {'id': 2, 'title': 'title3'}, {'id': 3, 'title': 'title4'}]

将返回[{'id': 2, 'title': 'title2'}, {'id': 3, 'title': 'title3'}],因为列表中的标题与列表1不同。

4 个答案:

答案 0 :(得分:2)

我建议您将您的设计重构为不是字典列表,而是重写ID:标题对的2个字典。该算法在这一点上是微不足道的,性能更好。

代码示例(编辑以反映SilentGhost的正确断言):

titles1 = {1: "title1", 2: "title2", 3: "title3"}
titles2 = {1: "title1", 2: "not_title2", 3: "title3"}
for id, title in titles1.iteritems():
    # verify the key is in titles2, compare title to titles2[id]

将字典列表转换为字典为id为key的代码示例:

titles1 = dict([(x["id"], x) for x in list1])

答案 1 :(得分:1)

[dc for dc in list1 if dc['id'] in [d["id"] for d in list2] and dc not in list2]

答案 2 :(得分:0)

如果内容相同,则不同的词典是相同的。所以你可以这样做:

for i in list1:
    if i not in list2:
        result.append(i)

答案 3 :(得分:0)

如果重构数据结构(假设id在一个字典中是唯一的),则可以更有效地实现比较(即O(n)。字典查找为O(1)。示例:

#!/usr/bin/env python

d1 = {
    1 : {"title" : "title1"},
    2 : {"title" : "title2"},
    3 : {"title" : "title3"},
}

d2 = {
    1 : {"title" : "title1"},
    2 : {"title" : "title3"},
    3 : {"title" : "title4"},
}

for key, value in d1.items():
    if not value == d2[key]:
        print "@", key, "values differ:", d1[key], "vs", d2[key]

# @ 2 values differ: {'title': 'title2'} vs {'title': 'title3'}
# @ 3 values differ: {'title': 'title3'} vs {'title': 'title4'}

或更短:

print [ (k, (d1[k], d2[k])) for k in d1 if not d2[k] == d1[k] ]
# [(2, ({'title': 'title2'}, {'title': 'title3'})), \ 
#    (3, ({'title': 'title3'}, {'title': 'title4'}))]