关闭

Python 集合1

标签: Python
277人阅读 评论(0) 收藏 举报
分类:
集合(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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:127623次
    • 积分:4043
    • 等级:
    • 排名:第8008名
    • 原创:273篇
    • 转载:56篇
    • 译文:0篇
    • 评论:5条
    最新评论