list 是最常用的线性数据结构
list是一系列元素的有序组合, 元素可以是任意对象,如数字,字符串,对象,列表等
list是可变的
list 可以嵌套任何数据类型
可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量
In [13]: l1 = [1, 2, 3] In [14]: l2 = l1 In [15]: l1.append(4) In [16]: l1 Out[16]: [1, 2, 3, 4] In [17]: l2 Out[17]: [1, 2, 3, 4]
In [1]: L = [] In [2]: L = list() In [3]: L = [1, 2, 3]
In [4]: L Out[4]: [1, 2, 3] In [5]: L.append(4) In [6]: L Out[6]: [1, 2, 3, 4]
In [9]: L = [1, 2, 3, 4] In [10]: L.extend([5, 6, 7]) In [11]: L Out[11]: [1, 2, 3, 4, 5, 6, 7]
In [11]: L Out[11]: [1, 2, 3, 4, 5, 6, 7] In [12]: L.insert(0, 0) In [13]: L Out[13]: [0, 1, 2, 3, 4, 5, 6, 7]
In [21]: [1, 2, 3] + [4, 5, 6] Out[21]: [1, 2, 3, 4, 5, 6]
In [23]: [1, 2, 3] * 3 Out[23]: [1, 2, 3, 1, 2, 3, 1, 2, 3]
In [25]: [[1, 2, 3]] * 3 Out[25]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
从左到右查找第一个匹配的value,移除该元素
In [15]: L Out[15]: [0, 1, 2, 3, 4, 5, 6, 7] In [16]: L.remove(3) In [17]: L Out[17]: [0, 1, 2, 4, 5, 6, 7]
从列表尾部弹出一个元素
In [18]: L Out[18]: [0, 1, 2, 4, 5, 6, 7] In [19]: L.pop(0) Out[19]: 0 In [20]: L Out[20]: [1, 2, 4, 5, 6, 7]
清除所有元素,剩空列表
In [21]: L Out[21]: [1, 2, 4, 5, 6, 7] In [22]: L.clear() In [23]: L Out[23]: []
将元素反转
In [26]: L Out[26]: [0, 1, 2, 3, 4, 3, 4, 5, 6, 7] In [27]: L.reverse() In [28]: L Out[28]: [7, 6, 5, 4, 3, 4, 3, 2, 1, 0]
默认为升序,加上reverse参数为降序
In [28]: L Out[28]: [7, 6, 5, 4, 3, 4, 3, 2, 1, 0] In [29]: L.sort() In [30]: L Out[30]: [0, 1, 2, 3, 3, 4, 4, 5, 6, 7] In [30]: L Out[30]: [0, 1, 2, 3, 3, 4, 4, 5, 6, 7] In [31]: L.sort(reverse=True) In [32]: L Out[32]: [7, 6, 5, 4, 4, 3, 3, 2, 1, 0]
In [30]: [3, 4] in [1, 2, [3, 4]] Out[30]: True
L1 L2不是同一个object, 即浅copy
In [1]: L = [1, 2, 3] In [2]: L1 = L.copy() In [3]: L2 = L In [4]: L Out[4]: [1, 2, 3] In [5]: L1 Out[5]: [1, 2, 3] In [6]: L2 Out[6]: [1, 2, 3] In [7]: L.append(4) In [8]: L Out[8]: [1, 2, 3, 4] In [9]: L1 Out[9]: [1, 2, 3] In [10]: L2 Out[10]: [1, 2, 3, 4] In [11]: id(L), id(L1), id(L2) Out[11]: (4500763656, 4500804360, 4500763656)
In [3]: L Out[3]: [0, 1, 2, 3, 3, 4, 4, 5, 6, 7] In [4]: L.count(3) Out[4]: 2 In [5]: L.count(8) Out[5]: 0
In [6]: L Out[6]: [0, 1, 2, 3, 3, 4, 4, 5, 6, 7] In [7]: L.index(3) Out[7]: 3 In [8]: L.index(4) Out[8]: 5 In [9]: L.index(8) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-9-4d02a661bd55> in <module>() ----> 1 L.index(8) ValueError: 8 is not in list
可以在每次循环中同时得到下标和元素
In [5]: s = 'abcdefghijkl' In [6]: for (index, char) in enumerate(s): ...: print(index, char) ...: 0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l
In [29]: L Out[29]: [0, 1, 2, 3, 3, 4, 4, 5, 6, 7] In [30]: L[0] = 10 In [31]: L Out[31]: [10, 1, 2, 3, 3, 4, 4, 5, 6, 7]
In [31]: L Out[31]: [10, 1, 2, 3, 3, 4, 4, 5, 6, 7] In [32]: L[3:5] Out[32]: [3, 3] In [33]: L[:5] Out[33]: [10, 1, 2, 3, 3] In [34]: L[3:] Out[34]: [3, 3, 4, 4, 5, 6, 7] In [35]: L[:] Out[35]: [10, 1, 2, 3, 3, 4, 4, 5, 6, 7] In [36]: L[3: -2] Out[36]: [3, 3, 4, 4, 5] In [37]: L[-4:-1] Out[37]: [4, 5, 6] In [38]: L[2:6:2] Out[38]: [2, 3] In [39]: L[6:2:-1] Out[39]: [4, 4, 3, 3] In [40]: L[::-1] Out[40]: [7, 6, 5, 4, 4, 3, 3, 2, 1, 10] In [41]: L[::2] Out[41]: [10, 2, 3, 4, 6]
列表解析是python的重要的语法糖
列表解析的速度比for in迭代快
ret = [expression for item in iterator]
等价于
ret = [] for item in iterator: ret.append(expression)
In [2]: L Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] In [3]: [x+1 for x in L] Out[3]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
迭代时间快
In [10]: timeit.timeit('[x+1 for x in range(10)]') Out[10]: 2.861458881001454 In [11]: timeit.timeit(''' ...: l=[] ...: for x in range(10): ...: l.append(x+1) ...: ''') Out[11]: 3.5815405790053774
[expr for item in iterable if cond1 if cond2]
等价于
ret = [] for item in iterable: if cond1: if cond2: ret.append(expr)
Out[12]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] In [13]: [x+1 for x in L if x%2 ==0] Out[13]: [1, 3, 5, 7, 9] In [15]: [x+1 for x in L if x%2 == 0 if x>2] Out[15]: [5, 7, 9]
ret = [expression for x in X for y in Y]
等价于
ret = [] for x in X: for y in Y: ret.append(expression)
In [17]: l1 = [1, 2, 3] In [18]: l2 = [4, 5, 6] In [19]: [(x, y) for x in l1 for y in l2] Out[19]: [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
In [17]: li = [10, 8, 4, 7, 5] In [18]: for index in range(len(li)): # 列表中一个5个数,比较为两两比较,因此实际次数为4次 ...: flag = True ...: for j in range(len(li) - index -1): ...: if li[j] > li[j+1]: # 判断前面的数是否大于后面的数 ...: li[j], li[j+1] = li[j+1], li[j] #大于则交换位置 ...: flag = False ...: if flag: ...: print("No changes in list") ...: No changes in list No changes in list In [19]: li Out[19]: [4, 5, 7, 8, 10]