将字典列表变成字典集

ben*_*890 1 python dictionary list set typeerror

我有一个字典列表,如下所示:

 a = [{1000976: 975},
 {1000977: 976},
 {1000978: 977},
 {1000979: 978},
 {1000980: 979},
 {1000981: 980},
 {1000982: 981},
 {1000983: 982},
 {1000984: 983},
 {1000985: 984}]
Run Code Online (Sandbox Code Playgroud)

我可能认为这是错误的,但我正在将此字典列表与另一个字典列表进行比较,并尝试删除一个列表中另一个列表中的元素(字典)。为了列出操作,我想将两者都转换为集合并执行集合减法。但是,我在尝试进行转换时收到以下错误。

set_a = set(a)

TypeError: unhashable type: 'dict'
Run Code Online (Sandbox Code Playgroud)

我是否错误地思考了这个问题?

Igu*_*aut 5

尝试这个:

>>> a = [{1000976: 975},
...  {1000977: 976},
...  {1000978: 977},
...  {1000979: 978},
...  {1000980: 979},
...  {1000981: 980},
...  {1000982: 981},
...  {1000983: 982},
...  {1000984: 983},
...  {1000985: 984}]
>>> a.extend(a)  # just to add some duplicates
>>> len(a)
20
>>> dict_set = set(frozenset(d.items()) for d in a)
>>> b = [dict(s) for s in dict_set]
>>> b
[{1000982: 981}, {1000983: 982}, {1000981: 980}, {1000985: 984}, {1000978: 977}, {1000980: 979}, {1000977: 976}, {1000976: 975}, {1000984: 983}, {1000979: 978}]
>>> len(b)
10
Run Code Online (Sandbox Code Playgroud)

如果您想在两个字典列表之间进行集合减法,则只需在两个字典上使用与上面相同的集合转换,进行减法,然后转换回来。

注意:至少字典中的所有值都应该是可散列的(以及键,但这是不言而喻的)。如果不是,您需要对值进行类似的转换,将其转换为某种可散列的、不可变的类型。

注意:这也不保留原始顺序;如果这对您很重要,则需要将其适应这样的算法。但关键是将字典转换为某种不可变类型。