我有一个按特定键排序的字典列表。每个字典包含 32 个元素,列表中有 4000 多个字典。我需要代码来处理列表并返回一个删除了所有重复项的新列表。
来自这些链接的方法:
不要帮我,因为字典是不可散列的。
有什么想法吗?如果您需要更多信息,请发表评论,我会添加信息。
编辑:
重复字典可以是 list[dictionary][key]
具有相同值的任意两个字典。
好了,这里给需要的人详细解释一下。
我有一个这样的字典列表:
[ {
"ID" : "0001",
"Organization" : "SolarUSA",
"Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
"Owner" : "Timothy Black",
}, {
"ID" : "0002",
"Organization" : "SolarUSA",
"Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
"Owner" : "Johen Wilheim",
}, {
"ID" : "0003",
"Organization" : "Zapotec",
"Matchcode" : "Zapotec, Something Street, Somewhere State, Whatev Zip",
"Owner" : "Simeon Yurrigan",
} ]
在这个列表中,第一个和第二个字典是重复的,因为它们的Matchcodes
是相同的。
现在这个列表按以下代码排序:
# sort_by is "Matchcode"
def sort( list_to_be_sorted, sort_by ):
return sorted(list_to_be_sorted, key=lambda k: k[sort_by])
所以我有一个按Matchcode
排序的整洁的字典列表。现在我只需要遍历列表,访问 list[dictionary][key]
并在两个键值匹配时删除重复项。
最佳答案
正如您可以使用 tuple
来获得与 list
等效的可散列值一样,您可以使用 frozenset
来获得可散列等效值到 dict
。唯一的技巧是您需要将 d.items()
而不是 d
传递给构造函数。
>>> d = {'a': 1, 'b': 2}
>>> s = frozenset(d.items())
>>> hash(s)
-7588994739874264648
>>> dict(s) == d
True
然后您可以使用您最喜欢的您已经见过的解决方案。将它们转储到 set
中,或者如果您需要保留顺序等,则使用 OrderedSet
或 unique_everseen
配方等。例如:
>>> unique_sets = set(frozenset(d.items()) for d in list_of_dicts)
>>> unique_dicts = [dict(s) for s in unique_sets]
或者,保留顺序并使用键值:
>>> sets = (frozenset(d.items()) for d in list_of_dicts)
>>> unique_sets = unique_everseen(sets, key=operator.itemgetter(key))
>>> unique_dicts = [dict(s) for s in unique_sets]
当然,如果你有列表或嵌套在其中的字典,你将不得不递归地转换,就像你对列表的列表所做的那样。
关于python - 如何从 Python 列表中删除重复的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497973/