列表是一个可变序列,并且能同时存放不同类型的元素,其中,列表推导可以帮助我们把一个序列或者是其他可迭代类型中的元素过滤或者是加工,然后再新建一个列表。例如:
>>> symbols = "abcde"
>>> code = [ord(symbol) for symbol in symbols]
>>> code
[97, 98, 99, 100, 101]
虽然可以按照列表推导来初始化元祖、数组或其他序列类型,但是生成器表达式是更好的选择,因为生成器表达式背后遵守了迭代器协议,可以逐个地产生元素,而不是先建一个完整的列表,然后再把这个列表传递到某个构造函数中。生成器表达式的语法跟类别差不多,只不过把方括号换成圆括号而已。
list.append(x): 在尾部添加一个新的元素,等价于 a[len(a):] = [x];
list.extend(iterable): 把可迭代对象iterable追加给list;
list.insert(i,x): 在list位置i之前插入元素x;
list.remove(x): 删除list中第一次出现的x,若list中没有x,会抛出ValueError的异常;
list.clear(): 清空list中所有的元素;
list.pop(i): 删除第i个位置的值,若无i值,删除最后的元素,并返回它的值;
list.count(x): 返回x在list中出现的次数;
list.sort():对列表进行排序
- list.sort方法排序列表,不会把原列表复制一份,这也是这个方法的返回值是None的原因。在python中遵循一个惯例:如果一个函数或者方法对对象进行的是就地改动,那它应该返回None,好让调用者知道传入的参数发生了变动,而且并未产生新的对象。
- 与list.sort方法不同,内置函数sorted,会新建一个列表作为返回值。
栈的特点是后进先出,在添加元素时,可以调用list.append(),在调出元素时,可以使用list.pop(), 例如:
>>> stack = [3,4,5]
>>> stack.append(6)
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack
[3, 4, 5]
示例:
>>> from collections import deque
>>> queue = deque([1, 2, 3])
>>> queue.append(4)
>>> queue
deque([1, 2, 3, 4])
>>> queue.popleft()
1
>>> queue
deque([2, 3, 4])
>>>
元组除了用作不可变的列表,还可以用于没有字段名的记录。例如:
>>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66,8014)
>>> city
'Tokyo'
元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。
元组拆包形式是平衡赋值,也就是说把一个可迭代对象里的元素,一并赋值到由对应的变量组成的元组中,可以用*处理剩下的元素,例如:
>>> a,b,*rest = range(5)
>>> a,b,rest
(0, 1, [2, 3, 4])
*前缀只能用在一个变量名前面,但是这个变量可以出现在赋值表达式的任意位置,例如:
>>> *head, b, c, d = range(5)
>>> head,b,c,d
([0, 1], 2, 3, 4)
collections.namedtuple是一个工厂函数,可以用来构建一个带字段名的元组和一个有名字的类,例如:
>>> from collections import namedtuple
>>> city = namedtuple('City','name country population coordinates')
>>> tokyo = city("Tokyo", 'JP', 36.33, (35.689722, 139,691667))
>>> tokyo
City(name='Tokyo', country='JP', population=36.33, coordinates=(35.689722, 139, 691667))
python对字典的实现做了高度的优化,散列表是字典类型性能出众的根本原因。
字典提供了很多的构造方法,如下:
>>> a = dict(one=1, two=2, three=3)
>>> b = {'one':1, 'two':2, 'three':3}
>>> c = dict(zip(['one', 'two', 'three'],[1,2,3]))
>>> d = dict({'one':1,'three':3,'two':2})
>>> e = dict([('one',1),('two',2),('three',3)])
>>> a == b == c == d == e
True
当字典d[k]不能找到正确的键时,python会抛出异常,可以用d.get(k, default)来代替d[k],
但是要更新某个键对应的值时,不管使用__getitem__还是get都会不自然,而且效率低,可以使用dict.setdefault,例如:
my_dict.setdefault(key,[]).append(new_value)
等价于
if key not in my_dict:
my_dict[key] = []
my_dict[key].append(new_value)
通过调用dict.items()可以获取dict的key和value,例如:
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k,v in knights.items():
... print(k,v)
...
gallahad the pure
robin the brave
集合的本质是许多唯一对象的集合。因此集合可以用于去重,例如:
>>> l = ['spam', 'spam', 'eggs', 'spam']
>>> set(l)
{'spam', 'eggs'}
>>> list(set(l))
['spam', 'eggs']
集合中的元素必须是可散列的,set类型本身是不可散列的
可散列的:原子不可变数据类型,例如,str、byte和数字类型
集合实现了很多基础的中缀运算符,给定两个集合a和b, a | b 返回合集, a & b 返回交集, a - b返回差集;
除了空集set(),集合的字符串表达形式总是以{…}的形式出现,例如:
>>> s = {1}
>>> type(s)
<class 'set'>
>>> s
{1}
>>> s.pop()
1
>>> s
set()
参考:
[1] 《流畅的Python》 Luciano Ramalho著 安道 吴珂译 人民邮电出版社
[2] https://docs.python.org/3/tutorial/datastructures.html