下面来介绍Python的另外两种数据类型,元组和集合。这两种在实现策略中使用的相对较少,学习一遍后,之后使用中如果遇到可以到这里查询。
集合是一个无序不重复元素的集,常用到其关系运算和消除重复元素。
任意对象的有序集合 元组与字符串和列表类似,是一个位置有序的对象的集合(也就是其内容维持从左到右的顺序)。与列表相同,可以嵌入到任何类别的对象中。
通过偏移存取 通过偏移而不是键来访问,例如可以使用索引,切片
属于不可变序列类型 不能在原处修改(因为他们是不可变的),但可以进行组合和复制,运算后会生成一个新的元组。
In [1]:
tup1 = ()
元组中只包含一个元素时,需要在元素后面添加逗号
In [2]:
tup1 = (50,)
元组与字符串类似,下标索引从0开始,可以进行截取,组合等。元组可以使用下标索引来访问元组中的值,如下实例:
In [3]:
tup1 = ('physics', 'chemistry', 1997, 2000);tup2 = (1, 2, 3, 4, 5, 6, 7 );print "tup1[0]: ", tup1[0]print "tup2[1:5]: ", tup2[1:5]
tup1[0]: physics
tup2[1:5]: (2, 3, 4, 5)
元组与列表不同,元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:
In [4]:
tup1 = (12, 34.56);tup2 = ('abc', 'xyz');# 以下修改元组元素操作是非法的。# tup1[0] = 100;# 创建一个新的元组tup3 = tup1 + tup2;print tup3;
(12, 34.56, 'abc', 'xyz')
元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,实例中元组被删除后,输出变量会有异常信息,如下实例:
In [1]:
tup = ('physics', 'chemistry', 1997, 2000);print tup;
('physics', 'chemistry', 1997, 2000)
In [2]:
del tup;print tup;
---------------------------------------------------------------------------NameError Traceback (most recent call last)<ipython-input-2-aaa0ed01a66f> in <module>() 1 del tup;----> 2 print tup;NameError: name 'tup' is not defined
任意无符号的对象,以逗号隔开,默认为元组,如下实例:
In [6]:
print 'abc', -4.24e93, 18+6.6j, 'xyz';x, y = 1, 2;print "Value of x , y : ", x,y;
abc -4.24e+93 (18+6.6j) xyz
Value of x , y : 1 2
元组不提供字符串、列表和字典中的方法。如果相对元组排序,通常先得将它转换为列表并使其成为一个可变对象,才能获得使用排序方法,或使用sorted内置方法。
In [7]:
T = ('c','a','d','e')tmp = list(T)tmp.sort()print tmpprint tuple(tmp)
['a', 'c', 'd', 'e']
('a', 'c', 'd', 'e')
In [8]:
T = ('c','a','d','e')sorted(T)
Out[8]:
['a', 'c', 'd', 'e']
列表解析也可用于元组的转换
In [9]:
T = (1,2,3,4,5)L = [x+20 for x in T]L
Out[9]:
[21, 22, 23, 24, 25]
In [10]:
T = (1,2,3,2,3,5,2)print T.index(2)print T.index(5,2,7)print T.count(2)
1
5
3
Python 还包含一种数据类型 set (集合)。集合是一个无序不重复元素的集。基本功能包括关系运算和消除重复元素。比如支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学关系运算。
大括号或 set() 函数可以用来创建集合。注:创建空集合,你必须使用 set() 而不是 {},后者用于创建空字典
In [11]:
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']fruit = set(basket)print fruitprint 'orange' in fruitprint 'crabgrass' in fruit
set(['orange', 'pear', 'apple', 'banana'])
True
False
In [12]:
a = set('abracadabra')b = set('alacazam')print 'a:\t',a # 唯一值print 'a - b:\t',a - b # 在a不在b里面print 'a | b:\t',a | b # 在a或b里print 'a & b:\t',a & b # a、b里面都有print 'a ^ b:\t',a ^ b # 在a或b里但是不同时在两个里面print 'a>b,a<b:\t',a>b,a<b
a: set(['a', 'r', 'b', 'c', 'd'])
a - b: set(['r', 'b', 'd'])
a | b: set(['a', 'c', 'b', 'd', 'm', 'l', 'r', 'z'])
a & b: set(['a', 'c'])
a ^ b: set(['b', 'd', 'm', 'l', 'r', 'z'])
a>b,a<b: False False
集合推导式语法
In [13]:
a = {x for x in 'abracadabra' if x not in 'abc'}#'abc'默认是集合a
Out[13]:
{'d', 'r'}
In [14]:
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']fruit = set(basket)
列表和字典不能嵌入到集合中,但是如果需要存储复合值,元组是可以嵌入的
In [15]:
S = set()S.add([1,2,3])
---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-15-7338704a28cc> in <module>() 1 S = set()----> 2 S.add([1,2,3])TypeError: unhashable type: 'list'
In [16]:
S.add((1,2,3))S
Out[16]:
{(1, 2, 3)}
In [17]:
type(S)
Out[17]:
set
In [ ]: