当只有一个键值不同时,从字典列表中删除重复项

use*_*850 2 python

我已经看到了一些类似的答案,但我无法找到针对此案例的具体内容:

我有一个这样的词典列表:

[
 {"element":Bla, "version":2, "date":"12/04/12"},
 {"element":Bla, "version":2, "date":"12/05/12"},
 {"element":Bla, "version":3, "date":"12/04/12"}
]
Run Code Online (Sandbox Code Playgroud)

实际的字典有许多其他键,但我要做的是删除所有具有完全相同的键对值的条目,日期除外.也就是说,删除所有重复项(由于日期不同而不是真正完全重复).在这种情况下,我期望得到的是:

[
 {"element":Bla, "version":2, "date":"12/04/12"},
 {"element":Bla, "version":3, "date":"12/04/12"}
]
Run Code Online (Sandbox Code Playgroud)

ovg*_*vin 6

你说在问题中没有提到的词典中有很多其他键.

这是O(n)算法来做你需要的:

>>> seen = set()
>>> result = []
>>> for d in dicts:
...     h = d.copy()
...     h.pop('date')
...     h = tuple(h.items())
...     if h not in seen:
...         result.append(d)
...         seen.add(h)

>>> pprint(result)
[{'date': '12/04/12', 'element': 'Bla', 'version': 2},
 {'date': '12/04/12', 'element': 'Bla', 'version': 3}]
Run Code Online (Sandbox Code Playgroud)

h是dict的副本.date密钥已从中删除pop.

然后tuple创建为可添加的可清除类型set.

如果h以前从未见过,我们会将其追加result并添加到seen.补充seenO(1)以及查找(h not in seen).

最后,result根据定义的h值仅包含唯一元素.