使用union将字典添加到`set()`中

NotAnAmbiTurner

我遇到了一些我想问的有趣的事情。

将字典添加到中set,我曾假设该字典将作为完整字典添加,但事实并非如此。仅添加密钥:

dicty = {"Key1": "Val1", "Key2": "Val2"}
setunion = set()
setunion.union(dicty)
=> set(['Key2', 'Key1'])

当您尝试使用添加它时set.add(),出现错误:

setadd = set()
setadd.add(dicty)
Traceback (most recent call last):
  File "python", line 1, in <module>
TypeError: unhashable type: 'dict'

显然,此行为与列表有很大不同:

   listy = []
   listy.append(dicty)
   listy
=> [{'Key2': 'Val2', 'Key1': 'Val1'}]

在文档中,它说集合是可哈希对象的无序集合,这暗示了上面的一些问题。

问题

这里发生了什么?设置项必须是可散列的,因此很显然与为什么我只将键添加到一起.union(),但是为什么会出错.add()

列表集的行为差异背后是否有一些可用性原因?

Python(或库)中是否有一种数据类型,其本质上类似于列表,但仅保留唯一项?

亚当·史密斯

不,按照定义,这是不可能的。哈希表(如dicts和sets)执行查找的方式与数组(如lists)进行查找的方式从根本上是唯一的逻辑错误是,如果您的数据类型仅保存重复项,那么将其中一个元素突变为非唯一性会怎样?

a, b = [0], [0, 1]
s = SpecialSet(a, b)
a.append(1)  # NOW WHAT?!

如果要向集合中添加字典,则可以添加dict.items视图(实际上只是一个元组列表),但是必须首先强制转换为元组。

a = {1:2, 3:4}
s = set()
s.add(tuple(a.items()))

然后,您必须重新广播以决定一旦离开集合就可以重新获得字典

for tup in s:
    new_a = dict(tup)

PEP416frozendict中提出了内置类型,但最终被拒绝。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章