##需求场景
我们需要存放一组数据,但是不希望存放重复的数据!用户的账号!
通过哈希(hash)算法在一个容器中存放多个没有顺序的不可以重复的数据。【无序、不重复】
List特点:元素有放入顺序,元素可重复。
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的。
例:链表和哈希表的区别。
如果你学过数据结构,你就知道链表的特性,list是一种链表
set是哈希表,通过哈希值来存取,所以理论上的存取时间复杂度是O(1)
set的去重是通过两个函数__hash__和__eq__结合实现的。
1、当两个变量的哈希值不相同时,就认为这两个变量是不同的;
2、当两个变量哈希值一样时,调用__eq__方法,当返回值为True时认为这两个变量是同一个,应该去除一个。返回FALSE时,不去重。
s1 = set() <class ‘set’>
s2 = {“a”} <class ‘set’>
s3 = {} <class ‘dict’> # 此方法声明的是字典类型
>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> type(thisset)
<class 'set'>
>>> thisset
{'Taobao', 'Google', 'Runoob'}
>>>
>>> a = {1, 2, 3}
>>> a.add(5)
>>> a
{1, 2, 3, 5}
>>>
>>> a.add(7,8)
Traceback (most recent call last):
File "" , line 1, in <module>
TypeError: add() takes exactly one argument (2 given)
>>>
s.update( {“字符串”} ) 将字符串添加到集合中。s.update( “字符串” ) 将字符串拆分单个字符后,然后再一个个添加到集合中,有重复的会忽略。
>>> thisset
{'Taobao', 'Google', 'Runoob'}
>>>
>>> thisset.update(('Taobao', 1, 2))
>>> thisset
{1, 2, 'Google', 'Runoob', 'Taobao'}
>>> a = thisset.update(3) # 无法添加单个数据
Traceback (most recent call last):
File "" , line 1, in <module>
TypeError: 'int' object is not iterable
>>>
>>>> a = thisset.update('a', 'b')
>>> thisset
{1, 2, 'Google', 'Runoob', 'a', 'b', 'Taobao'}
>>>
>>>
add和update
集合add方法:是把要传入的元素做为一个整个添加到集合中;集合update方法:是把要传入的元素拆分,做为个体传入到集合中。
>>>a = set('boy')
>>>a
{'b', 'o', 'y'}
>>>a.add('girl')
>>>a
{'girl', 'b', 'o', 'y'}
>>>a.update('the')
>>>a
{'h', 'y', 'o', 'girl', 'e', 'b', 't'}
>>> a
{1, 2, 3, 5, 9}
>>>
>>> a.clear() # 清空集合
>>> a
set() # 集合为空
>>>
>>> a
{'h', 'y', 'o', 'girl', 'e', 'b', 't'}
>>> a.pop()
'h'
>>> a
{'y', 'o', 'girl', 'e', 'b', 't'}
>>> a.remove('y')
>>> a
{'o', 'girl', 'e', 'b', 't'}
>>>
>>>
>>> a.remove('aa')
Traceback (most recent call last):
File "", line 1, in <module>
KeyError: 'aa'
>>> a.discard('aa')
>>> a.discard('o')
>>> a
{'girl', 'e', 'b', 't'}
>>>
集合:python中内置的组合数据类型之一,set表示储多个没有顺序的不可以重复的数据;通过hash算法让添加的数据不重复[剔重]!
>>> dir(set)
['__and__', '__class__', '__contains__',
'__eq__','__gt__', '__hash__','__iand__',
'__init__', '__isub__','__lt__', '__ne__',
'__new__', '__or__','__repr__',
'__ror__', '__rsub__', '__rxor__',
'add','difference_update', 'discard',
'intersection', 'issuperset', 'pop',
'remove','symmetric_difference_update',
'union', 'update']
>>>