您的位置:首页 > 编程语言 > Python开发

Python 集合1

2016-05-30 23:19 435 查看
集合(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python