Python 在字典列表上应用集合运算

Python 在字典列表上应用集合运算,python,list,dictionary,set,Python,List,Dictionary,Set,我的列表多次包含相同的词典,如 像 当我对其应用set操作以使其清晰时,它给出 TypeError: unhashable type: 'dict' 使这类列表项不同的正确方法是什么?一种简单的方法是将每个dict转换为字符串,并在其上使用set,然后将每个字符串转换回dict >>> import ast >>> l=[ {'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}, {'name': 'ZYLOG SYSTEMS

我的列表多次包含相同的词典,如

当我对其应用set操作以使其清晰时,它给出

TypeError: unhashable type: 'dict'

使这类列表项不同的正确方法是什么?

一种简单的方法是将每个
dict
转换为字符串,并在其上使用
set
,然后将每个字符串转换回
dict

>>> import ast
>>> l=[ {'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}, {'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}]
>>> l
[{'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}, {'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}]
>>> [ast.literal_eval(i) for i in set(map(str, l))]
[{'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}]
>>>
另一种用于不同排序的方法,其中我们将每个
dict
转换为
元组

>>> l=[ {'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}, {'gram': '1', 'name': 'ZYLOG SYSTEMS LTD'}]
>>> set([tuple(d.items()) for d in l])
{(('name', 'ZYLOG SYSTEMS LTD'), ('gram', '1'))}
>>> [dict(i) for i in set([tuple(sorted(d.items())) for d in l])]
[{'name': 'ZYLOG SYSTEMS LTD', 'gram': '1'}]
>>>

字典是可变对象,因此不能存储在集合中。您可以将字典转换为表示相同数据的不可变对象;对这些应用
set()
操作后,您可以将其转换回字典:

unique = [dict(t) for t in set(tuple(sorted(d.items())) for d in l)]
这会将每个字典转换为包含所有键值对的排序元组;但是,这假设字典中的值也是不可变的

排序是必需的,因为可能会生成两个具有相同键值对的词典,但由于散列冲突,它们以不同的顺序列出;两个键可以映射到同一个哈希表槽,但首先插入的键将获胜:

>>> {'bar': 42, 'baz': 81} == {'baz': 81, 'bar': 42}
True
>>> list({'bar': 42, 'baz': 81}) == list({'baz': 81, 'bar': 42})  # compare keys in order
False

根据哈希冲突的存在方式和创建输入字典的方式,字符串表示法中键的确切顺序很容易不同,即使对于实际上相等的字典也是如此。例如,请使用
[{'bar':42,'baz':81},{'baz':81,'bar':42}]
尝试您的方法。
>>> {'bar': 42, 'baz': 81} == {'baz': 81, 'bar': 42}
True
>>> list({'bar': 42, 'baz': 81}) == list({'baz': 81, 'bar': 42})  # compare keys in order
False