【发布时间】:2016-03-09 22:53:19
【问题描述】:
我刚刚遇到了一些有趣的问题,我想问一下。
将字典添加到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'}]
In the docs 它说集合是 hashable 对象的无序集合,这暗示了上述一些问题。
问题
这里发生了什么?集合项目必须是可散列的,很明显这与为什么我只使用.union() 将键添加到集合中,但为什么.add() 出现错误?
列表中集合的行为差异背后是否存在一些可用性原因?
Python(或库)中是否存在本质上类似于列表但只保留唯一项的数据类型?
【问题讨论】:
-
所以你想要一个保持顺序但不允许重复的结构?
-
为什么你认为
union是向集合添加东西的方式?union表示“构造一个新集合,将参数的 元素 添加到新集合中”。就像extend用于列表,但没有到位。 -
@senshin 我什至没有考虑订购问题。我更想知道允许添加任何对象但不允许(或“吸收”)重复的任何结构。
-
@NotAnAmbiTurner:这不是唯一的区别。
add没有真正的全新套装版本。union的变异版本是union_update。 -
@user2357112 噢噢噢噢。说得通。我正在学习 python,我在hackerrank 上胡闹,这在新概念方面非常好,但在避免混淆方面可能不是最好的。
标签: python dictionary set hashable