当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用union将字典添加到`set()`》经验,为你挑选了2个好方法。

我刚碰到了一些有趣的东西,我以为我会问.

将字典添加到a中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 
TypeError: unhashable type: 'dict'

显然,这种行为与列表非常不同:

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

在文档中,它表示集合是可散列对象的无序集合,这是对上述某些问题的暗示.

问题

这里发生了什么?设置项目必须是可清洗的,所以很清楚,这与为什么我只是将键添加到设置中.union(),但为什么错误与.add()

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

Python(或库)中是否存在基本上像列表一样的数据类型,但只保留唯一项?



1> Adam Smith..:

根据定义,这是不可能的.散列表(如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()))

然后你必须重新投射到dict,一旦它离开集合以获得字典

for tup in s:
    new_a = dict(tup)

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



2> Martijn Piet..:

使用set.union(),要求将要添加到集合中的方法参数的元素(而不是对象本身)添加到集合中。遍历字典可为您提供密钥。如果将其用于set.union()列表,元组或字符串,则将得到类似的结果,这些内容将添加到集合中:

>>> s = {42}
>>> s.union('foo')
set([42, 'o', 'f'])

单字符字符串'o''f'被添加,而不是字符串'foo'

您不能将字典添加到集合中,因为它们是可变的;集合仅支持存储可哈希对象,并且对象是可哈希对象的要求之一是它们是不可变的。


@AdamSmith:是的,违反了要求。Python使您可以用那只脚开枪。
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有