我遇到了一些我想问的有趣的事情。
将字典添加到中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(或库)中是否有一种数据类型,其本质上类似于列表,但仅保留唯一项?
不,按照定义,这是不可能的。哈希表(如dict
s和set
s)执行查找的方式与数组(如list
s)进行查找的方式从根本上是唯一的。逻辑错误是,如果您的数据类型仅保存重复项,那么将其中一个元素突变为非唯一性会怎样?
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] 删除。
我来说两句