概念
列表(list)是由若干个有序的元素组成的可变的队列。列表中的个体称为元素,由于有序,就可以使用索引。
列表是可变的
列表的定义和初始化
使用list()函数定义列表
list(iterable)的参数必须是一个可迭代对象
In [23]: a=list() In [24]: a Out[24]: []
使用可迭代对象定义列表
In [25]: list(range(5))
Out[25]: [0, 1, 2, 3, 4]
列表不能一开始就限制其大小
In [26]: list(4) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-26-31c61e8f6717> in <module> ----> 1 list(4) TypeError: 'int' object is not iterable
In [27]: list(1,4) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-27-a8056dfeeada> in <module> ----> 1 list(1,4) TypeError: list() takes at most 1 argument (2 given)
列表的索引访问
索引(下标)分为两种:
- 正索引:从左至右,从0开始依次编号列表中的每一个元素。
- 负索引:从右至左,从-1开始
正、负索引都不能超界,否则抛异常
索引的访问方式
list[index]来访问
In [29]: a=list(range(5)) In [30]: a[1] Out[30]: 1 In [31]: a[3] Out[31]: 3 In [32]: a[5] --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-32-4a84d856522b> in <module> ----> 1 a[5] IndexError: list index out of range
修改索引对应的值
lst[index]=value
In [57]: a=[1,2,[4,5]] In [58]: a[1]=1 In [59]: a Out[59]: [1, 1, [4, 5]] In [60]: a[2][1]=3 In [61]: a Out[61]: [1, 1, [4, 3]]
列表中的方法
append(value)尾部追加元素
返回值None,说明是就地修改,空间复杂度O(1)
In [50]: a=list() In [51]: a.append(1) In [52]: a Out[52]: [1] In [53]: a.append(list(range(4))) In [54]: a Out[54]: [1, [0, 1, 2, 3]]
index(value,[start,[stop]])
在指定区间内查找是否存在value,如果存在,就返回第一个找到的索引,否则,抛出异常
In [37]: a=[1,3,2,5,9,3] In [38]: a.index(3) Out[38]: 1 In [39]: a.index(3,-1) Out[39]: 5 In [49]: a.index(2,-4,-2) Out[49]: 2
注意,开始的索引(start)必须要在结束的索引(stop)的左边,否则抛出异常
In [42]: a.index(3,-2,1) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-42-9ee62b49790f> in <module> ----> 1 a.index(3,-2,1)
copy()
直接赋值
In [1]: a=[1,2,3,[4,5]] In [2]: b=a In [3]: b[1]=6 In [4]: a Out[4]: [1, 6, 3, [4, 5]] In [5]: b[3][1]=7 In [6]: a Out[6]: [1, 6, 3, [4, 7]]
复制列表,是浅拷贝或者称为影子拷贝(内存地址发生了变化)
In [9]: b=a.copy() In [10]: b Out[10]: [1, 6, 3, [4, 7]] In [11]: a Out[11]: [1, 6, 3, [4, 7]] In [12]: a[1]=5 In [13]: a Out[13]: [1, 5, 3, [4, 7]] In [14]: b Out[14]: [1, 6, 3, [4, 7]]
当列表的元素是引用类型的时候,情况有所不同,因为引用类型的内存地址是同一个
In [15]: b[3][0]=9 In [16]: b Out[16]: [1, 6, 3, [9, 7]] In [17]: a Out[17]: [1, 5, 3, [9, 7]]
In [27]: b=a In [28]: id(a) Out[28]: 140466732748424 In [29]: id(b) Out[29]: 140466732748424
insert(index,obj)
在指定的索引处插入元素,返回值为None,就地修改,时间负载度O(1)
In [67]: a Out[67]: [1, 1, [4, 3], [3, 6]] In [68]: a.insert(3,3) In [69]: a Out[69]: [1, 1, [4, 3], 3, [3, 6]]
insert方法索引超界问题
正索引超界,相当于尾部追加
In [70]: a.insert(4,3) In [71]: a Out[71]: [1, 1, [4, 3], 3, 3, [3, 6]] In [72]: a.insert(6,3) In [73]: a Out[73]: [1, 1, [4, 3], 3, 3, [3, 6], 3]
负索引超界相当于头部插入
In [74]: a.insert(-10,3) In [75]: a Out[75]: [3, 1, 1, [4, 3], 3, 3, [3, 6], 3]
extend(iterable)
将可迭代对象的元素追加至列表尾部,就地修改
In [76]: a=[1,2,3] In [77]: b=[4,5,6] In [78]: a.extend(b) In [79]: a Out[79]: [1, 2, 3, 4, 5, 6]
count(value)统计值出现的次数
In [81]: a.count(1) Out[81]: 1 In [82]: a.count(3) Out[82]: 0
remove(value)删除列表中的元素
从左至右,查看列表中第一个匹配的值,并移除,就地修改
In [83]: a Out[83]: [12, 5, 5, 6, 1] In [84]: a.remove(5) In [85]: a Out[85]: [12, 5, 6, 1] In [86]: a.remove(3) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-86-fe741f3ae678> in <module> ----> 1 a.remove(3) ValueError: list.remove(x): x not in list
pop([index])
从列表弹出索引对应的元素,如果不指定索引,默认弹出尾部的值。如果索引超界,会跑出异常
In [87]: a Out[87]: [12, 5, 6, 1] In [88]: a.pop(3) Out[88]: 1 In [89]: a Out[89]: [12, 5, 6] In [90]: a.pop() Out[90]: 6 In [91]: a Out[91]: [12, 5] In [92]: a.pop(2) --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-92-d5503bd15afa> in <module> ----> 1 a.pop(2) IndexError: pop index out of range
注意:pop是唯一一个即修改列表又返回非None值得方法
reverse()
将列表元素反转,就地修改
In [93]: a=[12,5,5,6,1] In [94]: a.reverse() In [95]: a Out[95]: [1, 6, 5, 5, 12]
sort(key=None, reverse=False)
对列表元素进行排序,就地修改,默认升序。
In [97]: lst=[5,3,'def',9,16,13,'a','abc'] In [98]: lst.sort(key=str,reverse=False) In [99]: lst Out[99]: [13, 16, 3, 5, 9, 'a', 'abc', 'def'] In [100]: lst.sort(key=int,reverse=True) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-100-1c8180a157db> in <module> ----> 1 lst.sort(key=int,reverse=True) ValueError: invalid literal for int() with base 10: 'a'
对于sort方法,千万不要用下面的形式
In [32]: a=[10,1,3,2,6] In [33]: c=a.sort() In [34]: c In [35]: a Out[35]: [1, 2, 3, 6, 10]
可以使用内置函数sorted替代
clear()
清空列表所有元素,只剩一个空列表
In [101]: a Out[101]: [1, 6, 5, 5, 12] In [102]: a.clear() In [103]: a Out[103]: []
列表的其他操作
len()计算列表长度
In [104]: lst Out[104]: [13, 16, 3, 5, 9, 'a', 'abc', 'def'] In [105]: len(lst) Out[105]: 8 In [106]: for i in range(len(lst)): ...: print(lst[i]) ...: 13 16 3 5 9 a abc def
+、* 操作(返回新列表)
In [107]: lst1=[3,2] In [108]: lst2=[4,2] In [109]: lst1+lst2 Out[109]: [3, 2, 4, 2] In [112]: lst1 * 3 Out[112]: [3, 2, 3, 2, 3, 2]
构建列表的重要方法
因为列表不能一开始就限制其大小,如 list(4) 这样是不可以的。所以有些时候如果确定有n个元素要用,可以先开辟出n个元素的空间,如:[0] * n。不要写[None] * n,因为None无法参与运算。