我有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不同。
答案 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'}))]