集合(set)
- set和dict类似,也是一组key的集合,但是不存储value。由于key不能重复,所以,在set中,没有重复元素。
- 要创建set,需要提供一个list作为输入集合。
In [24]: s = set([1, 2, 3])
In [25]: s
Out[25]: {1, 2, 3}
# 注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。
# 重复元素在set中被过滤掉
In [26]: s = set([1, 1, 2, 3, 4, 3, 4])
In [27]: s
Out[27]: {1, 2, 3, 4}
In [30]: s.add(5)
In [31]: s
Out[31]: {1, 2, 3, 4, 5}
In [32]: s.remove(5)
In [33]: s
Out[33]: {1, 2, 3, 4}
- set可以看成数学意义上的无序和无重复元素的集合,因为两个set可以做数学意义上的交集和并集等操作。
In [34]: s1 = set([1, 2, 3])
In [35]: s2 = set([2, 3, 4])
In [36]: s1 & s2
Out[36]: {2, 3}
In [37]: s1 | s2
Out[37]: {1, 2, 3, 4}
- set和dict原理一样,都不可以放入可变对象,因为没有办法判定两个可变对象是否相等,也就是无法判定set中是否有重复元素。
# 在初始化时,必须要一个list作为输入对象。
In [38]: l = ['a', 'b']
In [40]: s = set(l)
In [41]: s
Out[41]: {'a', 'b'}
# 因为list是可变对象,即无法对其使用hash算法(unhashable type)
In [44]: l1 = ['d', 'e']
In [45]: s.add(l1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 s.add(l1)
TypeError: unhashable type: 'list'
- tuple虽然是不可变对象,但是如果tuple中有可变对象的话,仍然无法添加进set和dict
# 往set中添加
In [53]: a = (1, 2, 3)
In [54]: b = (1, [2, 3])
In [55]: s = set([1, 2])
# tuple中有可变对象list[2, 3],故添加失败
In [58]: s.add(b)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 s.add(b)
TypeError: unhashable type: 'list'
# 添加成功
In [59]: s.add(a)
In [60]: s
Out[60]: {(1, 2, 3), 1, 2}
# 向dict中添加
In [54]: b = (1, [2, 3])
In [61]: h = {'a': 1, 'b': 2}
In [62]: type(h)
Out[62]: dict
# 添加成功
In [65]: c = (1, 2, 3)
In [66]: h[c] = 80
In [67]: h
Out[67]: {(1, 2, 3): 80, 'a': 90, 'b': 2}
# b中有可变对象,添加失败
In [68]: h[b] = 70
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 h[b] = 70
TypeError: unhashable type: 'list'