Python 列表 list

本文从WordPress迁移而来, 查看全部WordPress迁移文章

首先用dir和help,能得到很多信息

用dir查看list的信息,以pop方法为例,查看pop有什么作用,怎么使用它

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__',
'__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__','__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__',
'__rmul__', '__setattr__','__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__',
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> help(list.pop)
Help on method_descriptor:

pop(...)
L.pop([index]) -> item -- remove and return item at index (default last).
Raises IndexError if list is empty or index is out of range.

可见pop是通过索引来删除列表中的一个元素的,下面实验一下

1
2
3
4
5
>>> L = [1,2,3,4,5,6]
>>> L.pop(1)
2
>>> L
[1, 3, 4, 5, 6]

可见就是这样,删除了索引号为1的元素,2

留意到有另外一个方法remove,和pop有什么不同呢,继续用help查看一下

1
2
3
4
5
6
>>> help(list.remove)
Help on method_descriptor:

remove(...)
L.remove(value) -- remove first occurrence of value.
Raises ValueError if the value is not present.

remove是以确切的值 value 来删除元素的,在列表中找到 value 出现的第一个位置,然后删除,如果不存在 value 会出现ERROR

1
2
3
4
5
6
7
8
9
10
>>> L = [1,2,3,1,2,3]
>>> L.remove(3)
>>> L
[1, 2, 1, 2, 3]
>>> L.remove(5)

Traceback (most recent call last):
File "<pyshell#76>", line 1, in <module>
L.remove(5)
ValueError: list.remove(x): x not in list

可以利用 del 函数,删除 列表 的一个片段

1
2
3
4
>>> L = [1,2,3,4,5]
>>> del L[0:3]
>>> L
[4, 5]

例子举完了

在python中经常用列表实现数组的功能

在标准python解释器内部,列表就是C数组而不是链接结构;从python的列表中读取一个项的速度与索引一个C数组差不多

列表是可变对象,可以在原处修改

索引和分片赋值 : 索引,分片赋值都是在原地修改

索引赋值的话没啥好说,赋值的话,类型不一定类型不一定需要相同

分片赋值,可以理解为 “删除 + 插入” , 插入的数目不需要跟删除的数目相同

直接看几个代码例子比较容易理解

1
2
3
4
5
6
7
8
9
10
11
12
>>> L = [1,2,3,4]
>>> L[1] = 6
>>> L
[1, 6, 3, 4]
>>> L = [1,2,3,4]
>>> L[1] = "string"
>>> L
[1, 'string', 3, 4]
>>> L = [1,2,3,4]
>>> L[1] = [6,6]
>>> L
[1, [6, 6], 3, 4]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> L = [1,2,3,4,5,6]
>>> L[1:3] = [10]
>>> L
[1, 10, 4, 5, 6]
>>> L = [1,2,3,4,5,6]
>>> L[1:3] = [10,11,12,13,14]
>>> L
[1, 10, 11, 12, 13, 14, 4, 5, 6]

# 注意
>>> L = [1,2,3,4,5,6]
>>> L[1:3] = "string"
>>> L
[1, 's', 't', 'r', 'i', 'n', 'g', 4, 5, 6]
>>> L = [1,2,3,4,5,6]
>>> L[1:3] = ["string"]
>>> L
[1, 'string', 4, 5, 6]
# 注意

>>> L = [1,2,3,4,5,6]
>>> L[1:3] = ["AA","BB","CC","DD"]
>>> L
[1, 'AA', 'BB', 'CC', 'DD', 4, 5, 6]

可以利用分片,来实现删除列表的一段

1
2
3
4
>>> L = [1,2,3,4,5,6]
>>> L[1:3] = []
>>> L
[1, 4, 5, 6]

实现相同功能的区别,在原处修改和创建一个新的列表

在列表末尾添加一个元素,一般使用 append() 函数,append() 是在原处修改,合并列表是创建了一个新的列表

1
2
3
4
5
6
7
8
9
10
11
12
>>> L = [1,2,3]
>>> L.append(4)
>>> L
[1, 2, 3, 4]

>>> L = [1,2,3]
>>> L = L + [4]
>>> L
[1, 2, 3, 4]
>>> L += [5]
>>> L
[1, 2, 3, 4, 5]

同理,使用 extend() 可以在末尾添加多个元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
>>> L = [1,2,3,4]
>>> L.extend([5,6,7])
>>> L
[1, 2, 3, 4, 5, 6, 7]
>>> L.extend("string")
>>> L
[1, 2, 3, 4, 5, 6, 7, 's', 't', 'r', 'i', 'n', 'g']
>>> L.extend(["string"])
>>> L
[1, 2, 3, 4, 5, 6, 7, 's', 't', 'r', 'i', 'n', 'g', 'string']

# 注意
>>> L = [1,3,4,5]
>>> L += [6,7,8]
>>> L
[1, 3, 4, 5, 6, 7, 8]
>>>
>>> L += "string"
>>> L
[1, 3, 4, 5, 6, 7, 8, 's', 't', 'r', 'i', 'n', 'g']
>>> L += ["string"]
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 's', 't', 'r', 'i', 'n', 'g', 'string']
# 注意

# 注意 , + 合并运算符 , 两边的类型要相同,以下代码错误
>>> L = [1,2,3,4,5]
>>> L = L + "string"

Traceback (most recent call last):
File "<pyshell#179>", line 1, in <module>
L = L + "string"
TypeError: can only concatenate list (not "str") to list
>>> L = [1,2,3,4,5] + "string"

Traceback (most recent call last):
File "<pyshell#180>", line 1, in <module>
L = [1,2,3,4,5] + "string"
TypeError: can only concatenate list (not "str") to list

实验一下list的所有方法

  • append略
  • count一个参数value,统计list中value出现了多少次
1
2
3
4
5
6
7
8
>>> help(list.count)
Help on method_descriptor:

count(...)
L.count(value) -> integer -- return number of occurrences of value
>>> L = [1,2,3,1,4,5,1,6,7]
>>> L.count(1)
3
  • extend 略
  • index 搜索(索引),在列表的一段内搜索一个值value,找到的话返回第一个位置,找不到返回ERROR,3个参数,val , start , stop ,第一个为value,必须有,后面两个参数为默认参数
1
2
3
4
5
6
7
>>> L = [1,2,3,1,4,5,1,6,7]
>>> L.index(1)
0
>>> L.index(1,4)
6
>>> L.index(1,2,4)
3
  • insert 在给定的位置前面插入值value,必须两个参数 index,value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> L = [1,2,3,4,5]
>>> L.insert(0,5)
>>> L
[5, 1, 2, 3, 4, 5]
>>> L.insert(1,7)
>>> L
[5, 7, 1, 2, 3, 4, 5]

# 注意,当插入的位置 index 超过列表长度的时候,直接插入到列表最后
>>> L.insert(7,10)
>>> L
[5, 7, 1, 2, 3, 4, 5, 10]
>>> L.insert(10,10)
>>> L
[5, 7, 1, 2, 3, 4, 5, 10, 10]
  • pop,remove,reverse,sort略