当我在字典上使用set遇到这种行为时,我正在尝试一些想法来解决一个不相关的问题:
a = {"a": 1}
b = {"b": 2}
c = {"a": 1}
set([a, b, c])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-7c1da7b47bae> in <module>
----> 1 set([a, b, c])
TypeError: unhashable type: 'dict'
d = {"a": 1, "b": 2}
set(d)
Out[23]: {'a', 'b'}
set(a)
Out[24]: {'a'}
我有点理解为什么这组词典是不可散列的(它们是可变的),但是整个事情对我来说意义不大。为什么set(a)
和set(d)
只返回密钥,这有什么用?
谢谢!
答案 0 :(得分:2)
函数set(x)
接受任何可迭代的x
并将所有迭代的值放入集合中。
字典是可迭代的。当您遍历字典时,会得到密钥。因此,set(d)
将为您提供包含字典d
的所有键的新集合。
答案 1 :(得分:2)
set
将任意可迭代对象转换为集合,这意味着获取其参数的迭代器。 dict
的迭代器返回其密钥。 set
对dict
有用不是很多,但是set
并不是关心它的论点是什么。
关于dict
迭代器为何返回dict
的键的问题,这是语言设计人员做出的任意选择,但请记住,鉴于迭代键的选择,值或键值对,在键上进行迭代可能是有用性和简单性之间的最佳折衷方案。 (这三个都可以通过d.keys()
,d.values()
和d.items()
显式使用;在某种意义上,iter(d)
对于d.keys()
的常见用例来说是一种方便。)