斤斤计较之Python:列表
1、基本操作
列表可以是 a = 'abcde'、b = ['a','b','c','d','e'] (注意字符串索引不允许被赋值,但列表索引可以被修改)
+‐‐‐+‐‐‐+‐‐‐
| a | b | c | d | e |
+‐‐‐+‐‐‐+‐‐‐
0 1 2 3 4
‐4 ‐3 ‐2 ‐1
a[0] == b[0]=='a'
a[-1]==b[-1]=='e'
a[0:2]==a[:2]=='ab'
b[0:2]==b[:2]==['a','b']
b[::-1] = ['e', 'd', 'c', 'b', 'a']
a[::-1] == 'edcba'
a[-2:] == 'de'
2、把列表当作堆栈使用
我们都知道列表有两个操作,一个是append(),一个是pop()。我们可以把append函数看为一个入栈的操作,将pop()为一个出站的操作。而且满足的是先进后出的思维,正好与栈相仿。
harry= [1, 2, 3]
>>> harry.append(4)
>>> harry.append(5)
>>> harry
[1,2,3,4,5]
>>> harry.pop()
5
>>> harry
[1,2,3,4]
>>> harry.pop()
4
>>> harry.pop()
3
>>> harry
[1,2]
3、把列表当作队列使用
我们知道列表中有一个insert()函数,当使用list1.insert(0,x),时会在list1的首位插入元素x,而使用pop()可以从列表的最后一位删去元素。所以能够模拟进队出队操作。但是insert()的效率非常低为O(n),所以不推荐使用这种方法构建队列。
而使用库from collections import deque能够实现效率为O(1)的队列。
from collections import deque
>>> queue= deque([1,2,3])
>>> queue.append(4)
>>> queue.append(5)
>>>queue
deque([1,2,3,4,5])
>>> queue.popleft()
1
>>> queue.popleft() # The second to arrive now leaves
2
>>> queue
deque([3,4,5])
也就是说,append()相当于入队操作,popleft()相当于出队操作
4、列表推导式
当我们项创建一个列表式如:
cubes= []
for i in range(5):
x = i**3
cubes.append(x)
cubes= [0,1,8,27,64]
可以进行创建,但是创建完毕之后使用的变量x的值是存在的,也就是说产生了垃圾内存。
我们还可以使用列表推导式的方法就不会出现这种麻烦:
cubes= list(map(lambda x: x**3, range(5))) # 求0-4五个数的立方复制给cubes
或
cubes= [x**2 for x in range(5)] # 求0-4五个数的立方复制给cubes
当然还可使用if:cubes= [x**2 for x in range(5) if x%2] # 求奇数的立方
列表推导式还可以进行嵌套操作,当我们将一个矩阵进行转置是就可以使用列表嵌套操作:
matrix =[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]] # 创建一个3 * 4的矩阵
[[row[i] for row in matrix] for i in range(4)] # 将矩阵转换成4 * 3的矩阵形式
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
当然使用list(zip(*matrix))进行转置会更加方便
上述的操作与两层for循环嵌套在时间复杂度上并没有什么提升,他只是将算法变得简洁易懂了。
本人的另一篇博文详细记录了python列表的操作函数表格:传送门