集合(1)
回顾一下已经学过的数据类型:int/str/bool/list/dict/tuple
英文是set,翻译过来叫做“集合”。它的特点是:有的可变,有的不可变;元素无
次序,不可重复。
创建set
tuple算是list和str的杂合,那么set则可以堪称是list和dict的杂合。
set拥有类似dict的特点:可以用{}花括号来定义;启动的元素没有序列,也就是是
非序列类型的数据;而且,set中的元素不可重复,这就类似dict的键。
set也有一点list的特点:有一种集合可以原处修改。
>>> s1 = set("qiwsir")
>>> s1
set(['q','i','s','r','w'])
把str中的字符拆解开,形成set。特别注意观察:qiwsir中有两个i,但是在s1中,
只有一个i,也就是集合中元素不能重复。
>>> s2 = set([123, "google", "face", "book", "facebook", "book"])
>>> s2
set(['facebook', 123, 'goole', 'book', 'face'])
在创建集合的时候,如果发现了重复的元素,就会过滤一下,剩下不重复的。而且
,从S2的创建可以看出,查看结果显示的元素顺序排列与开始建立是不同,完全是
随意显示的,这说明集合中的元素没有序列。
>>> s3 = {"facebook", 123} #通过{}直接创建
>>> s3
set([123,'facebook'])
除了用set()来创建集合。还可以使用{}的方式,但是这种方式不提倡使用,因为
在某些情况下,python搞不清楚是字典还是集合。
>>> s3 = {"facebook",[1,2,'a'],{"name":"python","lang":"english"},123}
TypeError:unhashable type: 'dict'
>>> s3 = {"facebook", [1,2],123}
TypeError:unhashable type: 'list'
"unhashable",它的反义词是"hashable",很多时候翻译为“可哈希”,其实它由一
个不是音译的名词“散列”。某数据“不可哈希”(unhashable)就是其可变,如
list/dict,都能原地修改,就是unhashable。否则,不可变的,类似str那样不能原
地修改,就是hashable(可哈希)的。
对于前面已经提到的字典,其键必须是hashable数据,即不可变的。
>>> s1
set(['q','i','s','r','w'])
>>> s1[1] = "I"
TypeError: 'set' object does not support item assignment
>>> s1
set(['q','i','s','r','w'])
>>> lst = list(s1)
>>> lst
['q','i','s','r','w']
>>> lst[1] = "I"
>>> lst
['q','I','s','r','w']
分别用list()和set()能够实现两种数据类型之间的转化。
特别说明,利用set()建立起来的集合是可变集合,可变集合都是unhashable类型的
。
>>> a_set = {}
>>> a_set.add("qiwsir")
AttributeError: 'dict' object has no attribute 'add'
>>> type(a_set)
<type 'dict'>
特别说明一下,{}这个东西,在dict和set中都用。但是,如果上面的方法建立的是
dict,不是set。这里python规定的,要建立set,只能用前面介绍的方法了。
>>> a_set = {'a', 'i'}
>>> type(a_set)
<type 'set'>
>>> a_set.add("qiwsir")
>>> a_set
set(['i', 'a', 'qiwsir'])
>>> b_set = set("python")
>>> type(b_set)
<type 'set'>
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> b_set.add("qiwsir")
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.add([1,2,3]) #报错,list是不可哈希的,集合中的元素应该是
hashable类型。
TypeError:unhashable type:'list'
>>> b_set.add('[1,2,3]') #可以这样
>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> help(set.update)
update(...)
update a set with the union of itself and others.
>>> s1
set(['a', 'b'])
>>> s2
set(['github', 'qiwsir'])
>>> s1.update(s2) #把s2的元素并入到s1中。
>>> s1 #s1的引用对象修改
set(['a', 'qiwsir', 'b', 'github'])
>>> s2
set(['github', 'qiwsir'])
>>> s2.update("goo")
>>> s2
set(['github', 'o', 'g', 'qiwsir'])
>>> s2.update((2,3))
>>> s2
set([2, 3, 'g', 'o', 'github', 'qiwsir'])
pop, remove, discard, clear
>>> help(set.pop)
pop(...)
Remove and return an arbitrary set element.
Raises keyError if the set is empty.
>>> b_set
set(['[1,2,3]', 'h', '0', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop() #从set中任意选一个删除,并返回该值
'[1,2,3]'
>>> b_set.pop()
'h'
>>> b_set.pop()
'o'
>>> b_set
set(['n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop("n") #如果要指定删除某个元素,报错了
TypeError: pop() takes no arguments (1 given)
pop()不能有参数。
set.remove(obj)中的obj,必须是set中的元素,否则就报错。
>>> a_set
set(['i', 'a', 'qiwsir'])
>>> a_set.remove("i")
>>> a_set
set(['a', 'qiwsir'])
>>> a_set.remove("w")
keyError: 'w'
跟remove(obj)类似的还有一个discard(obj):
discard(obj)中的obj如果是set中的元素,就删除,如果不是就什么也不做。
>>> a_set.discard('a')
>>> a_set
set(['qiwsir'])
>>> a_set.discard('b')
>>>
在删除上还有一个绝杀,就是set.clear(),它的功能是:
>>> a_set
set(['qiwsir'])
>>> a_set.clear()
>>> a_set
set([])
>>> bool(a_set)
False
回顾一下已经学过的数据类型:int/str/bool/list/dict/tuple
英文是set,翻译过来叫做“集合”。它的特点是:有的可变,有的不可变;元素无
次序,不可重复。
创建set
tuple算是list和str的杂合,那么set则可以堪称是list和dict的杂合。
set拥有类似dict的特点:可以用{}花括号来定义;启动的元素没有序列,也就是是
非序列类型的数据;而且,set中的元素不可重复,这就类似dict的键。
set也有一点list的特点:有一种集合可以原处修改。
>>> s1 = set("qiwsir")
>>> s1
set(['q','i','s','r','w'])
把str中的字符拆解开,形成set。特别注意观察:qiwsir中有两个i,但是在s1中,
只有一个i,也就是集合中元素不能重复。
>>> s2 = set([123, "google", "face", "book", "facebook", "book"])
>>> s2
set(['facebook', 123, 'goole', 'book', 'face'])
在创建集合的时候,如果发现了重复的元素,就会过滤一下,剩下不重复的。而且
,从S2的创建可以看出,查看结果显示的元素顺序排列与开始建立是不同,完全是
随意显示的,这说明集合中的元素没有序列。
>>> s3 = {"facebook", 123} #通过{}直接创建
>>> s3
set([123,'facebook'])
除了用set()来创建集合。还可以使用{}的方式,但是这种方式不提倡使用,因为
在某些情况下,python搞不清楚是字典还是集合。
>>> s3 = {"facebook",[1,2,'a'],{"name":"python","lang":"english"},123}
TypeError:unhashable type: 'dict'
>>> s3 = {"facebook", [1,2],123}
TypeError:unhashable type: 'list'
"unhashable",它的反义词是"hashable",很多时候翻译为“可哈希”,其实它由一
个不是音译的名词“散列”。某数据“不可哈希”(unhashable)就是其可变,如
list/dict,都能原地修改,就是unhashable。否则,不可变的,类似str那样不能原
地修改,就是hashable(可哈希)的。
对于前面已经提到的字典,其键必须是hashable数据,即不可变的。
>>> s1
set(['q','i','s','r','w'])
>>> s1[1] = "I"
TypeError: 'set' object does not support item assignment
>>> s1
set(['q','i','s','r','w'])
>>> lst = list(s1)
>>> lst
['q','i','s','r','w']
>>> lst[1] = "I"
>>> lst
['q','I','s','r','w']
分别用list()和set()能够实现两种数据类型之间的转化。
特别说明,利用set()建立起来的集合是可变集合,可变集合都是unhashable类型的
。
>>> a_set = {}
>>> a_set.add("qiwsir")
AttributeError: 'dict' object has no attribute 'add'
>>> type(a_set)
<type 'dict'>
特别说明一下,{}这个东西,在dict和set中都用。但是,如果上面的方法建立的是
dict,不是set。这里python规定的,要建立set,只能用前面介绍的方法了。
>>> a_set = {'a', 'i'}
>>> type(a_set)
<type 'set'>
>>> a_set.add("qiwsir")
>>> a_set
set(['i', 'a', 'qiwsir'])
>>> b_set = set("python")
>>> type(b_set)
<type 'set'>
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> b_set.add("qiwsir")
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.add([1,2,3]) #报错,list是不可哈希的,集合中的元素应该是
hashable类型。
TypeError:unhashable type:'list'
>>> b_set.add('[1,2,3]') #可以这样
>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> help(set.update)
update(...)
update a set with the union of itself and others.
>>> s1
set(['a', 'b'])
>>> s2
set(['github', 'qiwsir'])
>>> s1.update(s2) #把s2的元素并入到s1中。
>>> s1 #s1的引用对象修改
set(['a', 'qiwsir', 'b', 'github'])
>>> s2
set(['github', 'qiwsir'])
>>> s2.update("goo")
>>> s2
set(['github', 'o', 'g', 'qiwsir'])
>>> s2.update((2,3))
>>> s2
set([2, 3, 'g', 'o', 'github', 'qiwsir'])
pop, remove, discard, clear
>>> help(set.pop)
pop(...)
Remove and return an arbitrary set element.
Raises keyError if the set is empty.
>>> b_set
set(['[1,2,3]', 'h', '0', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop() #从set中任意选一个删除,并返回该值
'[1,2,3]'
>>> b_set.pop()
'h'
>>> b_set.pop()
'o'
>>> b_set
set(['n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop("n") #如果要指定删除某个元素,报错了
TypeError: pop() takes no arguments (1 given)
pop()不能有参数。
set.remove(obj)中的obj,必须是set中的元素,否则就报错。
>>> a_set
set(['i', 'a', 'qiwsir'])
>>> a_set.remove("i")
>>> a_set
set(['a', 'qiwsir'])
>>> a_set.remove("w")
keyError: 'w'
跟remove(obj)类似的还有一个discard(obj):
discard(obj)中的obj如果是set中的元素,就删除,如果不是就什么也不做。
>>> a_set.discard('a')
>>> a_set
set(['qiwsir'])
>>> a_set.discard('b')
>>>
在删除上还有一个绝杀,就是set.clear(),它的功能是:
>>> a_set
set(['qiwsir'])
>>> a_set.clear()
>>> a_set
set([])
>>> bool(a_set)
False