Python有几个复合数据类型,用于表示其他值。最通用的是list(列表),是一种有序的集合。
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
变量 classmates 就是一个list。用 len() 函数可以获得list元素的个数:
>>> len(classmates)
3
可以用索引访问 list 中的元素,索引是从0开始;也可以用 -1 做索引,直接获取最后一个元素:
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'
>>> classmates[3]
Traceback (most recent call last):
File " ", line 1, in
IndexError: list index out of range
>>> classmates[-1] 'Tracy'
>>> classmates[-2]
'Bob'
>>> classmates[-2:]
['Bob', 'Jack']
返回一个新的列表。
>>> classmates[:]
['Michael', 'Bob', 'Jack']
切片操作返回列表一个新的(浅)拷贝副本,相当于 classmates.copy() 函数。
对 list 的基本操作:
1. 添加元素到末尾:list.append(x) 相当于 a[len(a):] = [x]
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
5.删除指定位置的元素:list.pop(索引位置) 返回指定位置的元素,随即删除
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
6.替换某个位置上的元素,直接给对应的索引位置赋值:
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
7.从列表删除所有元素:list.clear() 相当于 del a[:]
8.返回列表中第一个值为 x 的元素的索引,如果没有匹配的元素会返回一个错误:list.index(x)
9.返回 x 在列表中出现的次数:list.count(x)
10.对列表中的元素进行升序排序:list.sort() 降序排序:list.reverse()
11.连接列表 list.extend(L) 相当于 a[len(a):] = L
也可以如下连接:
>>> classmates + ['Lily','John','Ally']
['Michael', 'Bob', 'Jack', 'Lily', 'John', 'Ally']
12.list 里面的元素的数据类型可以不同,可以嵌套。
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
tuple(元组)
tuple 是初始化之后不能更改的有序列表(元组)。意义在于 tuple 不能更改,所以代码更安全,尽可能的使用 tuple 代替 list 。
tuple 和 list 非常相似,形式上区别在于 [] 与 () ,同上,classmates列表,tuple初始化之后不能更改,没有append(),insert()方法等,获取元素方法同 list 。
>>> classmates = ('Lily','John','Ally')
>>> classmates.append('Jack')
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'tuple' object has no attribute 'append'
注意定义特殊的tuple:(空的 tuple ,只有一个元素的 tuple,“可变的”tuple )
>>> t = ()
>>> t
()
>>> t = (1,)
>>> t
(1,)
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
注:其实是 tuple 中第三个元素是 list 类型,是可更改的,所以“可变的”tuple。
元组封装(tuple packing)例子:
>>> t = 12345,54321,'Hello!'
>>> x,y,z = t
>>> x
12345
>>> y
54321
>>> z
'Hello!'
>>> t
(12345, 54321, 'Hello!')
注:x,y,z = t 这个调用等号右边可以是任何线性序列,称之为 序列拆封 。序列拆封要求左侧的变量数目与序列的元素个数相同。
dict(字典)
Python内置了字典:dict的支持(dictionary),以 关键字key 为索引,关键字可以是任意不可变类型,通常是字符串或数值。
使用键值对(key-value)存储,在一个字典之内key必须是互不相同的。一对大括号 { } 创建一个空的字典。初始化列表时,在大括号内放置一组逗号分隔的 键:值 对。dict的特点是查找速度快。
>>> tel = {'jack':4098,'sape':4139}
>>> tel['rose'] = 4127 #添加新的键值对 rose:4127
>>> tel
{'jack': 4098, 'sape': 4139, 'rose': 4127}
>>> del tel['sape'] #删除 sape 键值对
>>> tel['july'] = 4127 #插入成功,说明键值对的value可以重复
>>> tel
{'jack': 4098, 'rose': 4127, 'july': 4127}
>>> list(tel.keys()) #列出tel字典中的键(key)
['jack', 'rose', 'july']
>>> sorted(tel.keys()) #对tel字典中的键(key)进行排序(默认升序排序)
['jack', 'july', 'rose']
>>> 'rose' in tel #判断 key 是否在 dict 中,也可以用dict提供的get()方法,
#如果key不存在,返回None(在交互环境下不显示结果),或返回自己指定的value
True
>>> 'lily' in tel
False
构建dict的方式:
1. >>> tel = {'jack':4098,'sape':4139,'guido':4127}
2. >>> tel = dict([('sape',4139),('guido',4127),('jack',4098)])
3. >>> tel = dict(sape=4139,guido=4127,jack=4098)
结果:>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
字典推导式可以从任意的价值表达式中创建字典:
>>> {x: x**2 for x in (2,4,6)}
{2: 4, 4: 16, 6: 36}
删除一个key,用pop(key)方法,对应的value也会从dict中删除:
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel.pop('guido')
4127
>>> tel
{'sape': 4139, 'jack': 4098}
dict | 1.查找和插入速度快,不会随着key的增加而变慢;2.需要占用大量的内存,内存浪费多 |
list | 1.查找和插入的时间随着元素的增加而增加;2.占用空间小,内存浪费少 |
set(集合)
set是一个无序不重复key的集合,基本功能包括关系测试和消除。集合运算对象还支持 union(联合),intersection(交),difference(对称差集)等数学运算。
大括号或set()函数可以用来创建集合。注意,创建空集合,要使用set()而不是{}。后者用于创建空字典。
>>> basket = {'apple','orange','apple','pear','orange','banana'}
>>> print(basket)
{'banana', 'apple', 'pear', 'orange'}
>>> basket
{'banana', 'apple', 'pear', 'orange'}
>>> 'orange' in basket
True
>>> 'pinapple' in basket
False
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a ‐ b #在 a 中不在 b 中的字母
{'r', 'd', 'b'}
>>> a | b #在 a 中或 b 中的字母
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b #在 a 中且在 b 中的字母
{'a', 'c'}
>>> a ^ b #在 a 中或在 b 中 但不在交集中的字母 a^b = a|b - a&b
{ 'r', 'd', 'b', 'm', 'z', 'l'}
操作:
通过add(key)方法可以添加元素到set中,可以重复添加,但没有效果:
>>> str = set([3,2,1,1,4,5])
>>> str
{1, 2, 3, 4, 5}
>>> str.add(3)
>>> str
{1, 2, 3, 4, 5}
通过remove(key)方法删除元素:
>>> str
{1, 2, 3, 4, 5}
>>> str.remove(2)
>>> str
{1, 3, 4, 5}
set与dict的唯一区别在于没有存储对应的value,但set的原理和dict一样,两者都不可以放入可变对象。