【发布时间】:2012-09-07 19:46:10
【问题描述】:
编辑:正如@BrenBarn 指出的那样,原文没有意义。
给定一个字典列表(由 csv.DictReader 提供——它们都有 str 键和值),最好通过将它们全部填充到一个集合中来删除重复项,但这不能直接完成因为dict 不可散列。一些existing questions 谈到如何 伪造__hash__() 的集合/字典,但没有说明应该首选哪种方式。
# i. concise but ugly round trip
filtered = [eval(x) for x in {repr(d) for d in pile_o_dicts}]
# ii. wordy but avoids round trip
filtered = []
keys = set()
for d in pile_o_dicts:
key = str(d)
if key not in keys:
keys.add(key)
filtered.append(d)
# iii. introducing another class for this seems Java-like?
filtered = {hashable_dict(x) for x in pile_o_dicts}
# iv. something else entirely
本着Zen of Python 的精神,什么是“显而易见的做法”?
【问题讨论】:
-
我不确定你在问什么。您是否在寻找a frozen dictionary(即可以用作另一个字典中的键的那个)?您的代码示例没有多大意义(例如,您的第一个示例只是重新创建了原始
pile_o_dicts)。 -
并不是说这是首选的解决方案或任何东西,但在您的第一个示例中,您可以通过使用 dict 理解来避免评估返回 dict 的“往返”:
{repr(d):d for d in pile_o_dicts}.values()代替一个集合 + 一个带有 evals 的列表比较 -
@BrenBarn 你是对的,编辑成一些(希望!)明智的东西。
标签: python python-3.x