Python文档
Python教程
随笔

python的list列表是一个非常基本,也是非常有用的一个数据结构。它的用法再次阐释了python语法的简洁,强大。掌握了python list列表的用法,可以极大的提高开发效率;本文通过例子,详细介绍了python3中列表list的各种用法,小伙伴们再也不用东奔西跑到处找资料,关于python列表list的用法,这篇文章基本都有举例。

python list列表的基本定义

list在python是有序且可更改的列表,允许重复的值。

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a == b
True
>>> b = [1,3,2]
>>> a == b
False
>>> a = [1,2,3,3]
>>> a
[1, 2, 3, 3]
>>>
>>> a[1] = 4
>>> a
[1, 4, 3, 3]
>>> a = ["this", "is", "list", "列表"]
>>> a
['this', 'is', 'list', '列表']

列表里面的值可以是不同类型的对象,比如下面的列表可以是数字和字符串的混合

>>> a = [1, 2, 3, 4, 5, "string"]
>>> a
[1, 2, 3, 4, 5, 'string']

list列表的索引

存取list里面的值用方括号+索引编号直接存取list里面的值,索引编号从0开始:

>>> a = [1, 2, 3, 4, 5, "string"]
>>> a[1]
2
>>> a[0]
1
>>> a = [1, 2, 3, 4, 5, "string"]
>>> a[2] = 'changedValue'
>>> a
[1, 2, 'changedValue', 4, 5, 'string']

但是索引编号不能大于等于list长度,否则就会抛出异常:

>>> a = [1, 2, 3, 4, 5, "string"]
>>> a[10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

索引编号还可以是负数,负数索引编号的意思是从list末尾开始。这个语法特点在python里面算是比较特别又好用的语法,在其它常见编程语言比如:c++,java,javascript等没有类似的用法。当索引为负数的时候,list最后一个是-1,倒数第二个是-2。以此类推类推

>>> a = [1, 2, 3, 4, 5, "myval"]
>>> a[-1]
'myval'

指定索引范围

可以通过指定范围的起点和终点来指定索引范围,这样会生成一个新的list。
指定范围是在方括号内写起止的索引数字,英文冒号隔开。

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

当然也可以用负数的索引来指定范围

>>> a[3 : -1]
[4, 5]

如果索引是列表的第一个或者最后一个,还可以省略索引值

>>> a[:3]
[1, 2, 3]
>>> a[3:]
[4, 5, 6]

甚至还可以两个索引都省略,下面的例子是生成一个新的列表,内容和原来的列表一样。

>>> a[:]
[1, 2, 3, 4, 5, 6]

所以在python里面,mylist[:]也常常用来快速的复制,克隆一个list列表。

遍历list列表

for循环来遍历列表:

>>> a = [1,2,3,4,5,6]
>>> for b in a:
...     print(b)
...
1
2
3
4
5
6

while循环来遍历列表list

>>> a = [1,2,3,4,5,6]
>>> length = len(a)
>>> i = 0
>>> while i < length:
...     print(a[i])
...     i += 1
...
1
2
3
4
5
6

用comprehension列表推导式来循环

>>> a = [1, 2, 3, 4, 5, 6]
>>> [print(i) for i in a]
1
2
3
4
5
6
[None, None, None, None, None, None]

在上面的例子中,我们看到成功的打印了列表中的数字;但是为什么返回一个全是None的列表呢?因为在列表推导式(comprehension)里面for前面的是生成的语句,这个例子里面生成语句是print(i)返回的都是None,所以最后生成了一个全是None的新列表;

在列表推导式里面(comprehension),还可以有if语句来对列表进行过滤或限定

>>> [print(i) for i in a if i >= 3]
3
4
5
6
[None, None, None, None]

使用enumerate

如果需要打印列表的内容和它的索引,可以结合enumerate对象来使用

>>> a = [1, 3, 5, 7, 9]
>>> for i, val in enumerate(a):
...     print (i, ",", val)
...
0 , 1
1 , 3
2 , 5
3 , 7
4 , 9

生成列表:

赋值语句中生成一个列表

>>> a = [1, 3, 5, 7, 9]

还可以通过现有的list来生成一个新的列表:

>>> a = [1, 3, 5, 7, 9]
>>> b = a[2:4]
>>> b
[5, 7]
>>> b = a[:]
>>> b
[1, 3, 5, 7, 9]

也可以用range()对象和list comprehension(列表推导式)动态生成一个列表

>>> a = [item for item in range(3)]
>>> a
[0, 1, 2]
>>> a = [item * 2 for item in range(3)]
>>> a
[0, 2, 4]
>>> a = [1, 3, 5, 7, 9]
>>> b = [i * 2 for i in a if i > 1]
>>> b
[6, 10, 14, 18]

split()将字符串转换分解成列表

>>> a = "This is the 12345678.tech site".split()
>>> a
['This', 'is', 'the', '12345678.tech', 'site']

del关键字删除list列表中的值

>>> a = ['the', '12345678', 'tech', 'site']
>>> a
['the', '12345678', 'tech', 'site']
>>> del a[0]
>>> a
['12345678', 'tech', 'site']
>>> del a[-1]
>>> a
['12345678', 'tech']
>>>

len()获得列表的长度

>>> a = ['the', '12345678', 'tech', 'site']
>>> len(a)
4

用加法+符号相加两个列表:

>>> b = a[1:]
>>> b
['12345678', 'tech', 'site']
>>> c = a + b
>>> c
['the', '12345678', 'tech', 'site', '12345678', 'tech', 'site']

用乘法符号*重复列表

用乘法符号可以将已有列表重复N次,比如下面的例子

>>> a = [1, 2, 3]
>>> b = a * 4
>>> b
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

注意上面的例子不是把a里面的1,2,3依次乘4,而是将1,2,3这个内容重复4次

>>> a = ['the', '12345678', 'tech', 'site']
>>> a * 4
['the', '12345678', 'tech', 'site', 'the', '12345678', 'tech', 'site', 'the', '12345678', 'tech', 'site', 'the', '12345678', 'tech', 'site']

用in关键字检查list列表是否包某个值:

>>> a = ['the', '12345678', 'tech', 'site']
>>> if '12345678' in a: print('hi')
...
hi
>>> if 'aaabbb' not in a: print('not exists')
...
not exists

maxmin函数求最大最小值

max(), min()函数取得list列表中最大,最小的值。

>>> a = ['the', '12345678', 'tech', 'site']
>>> max(a)
'the'
>>> min(a)
'12345678'

上面例子中,字符串比较的办法来确定最大最小值

添加内容(扩展)到list列表

append()方法将值加到list的最后位置

>>> a = [1,2,3,4,5,6]
>>> a.append(7)
>>> a
[1, 2, 3, 4, 5, 6, 7]

insert()方法将值加到list列表的指定位置

>>> a.insert(1, 10)
>>> a
[1, 10, 2, 3, 4, 5, 6, 7]

extend()方法将一个列表或序列加到现有list列表

>>> a = [1,2,3,4,5,6]
>>> a.extend([10,11,12])
>>> a
[1, 2, 3, 4, 5, 6, 10, 11, 12]
>>> b_turple = (20, 21, 22)
>>> a.extend(b_turple)
>>> a
[1, 2, 3, 4, 5, 6, 10, 11, 12, 20, 21, 22]

上面例子中“序列”可以是另一个list列表,也可以是turple,set,iterable等其他科循环的对象

pop()方法将列表中最后一个值取出并从列表中移除

如果将list列表看成栈,用pop()方法将列表中最后一个值取出来同时从列表中移除

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

list列表的排序:

python中list的排序的方法比较多,值得单独拿一章出来讲讲:

最简单的排序

>>> a = [1,4,3,5,1]
>>> a.sort()
>>> a
[1, 1, 3, 4, 5]

正,反序排序

sort()方法还可以指定reverse参数,是否反序排列

>>> a.sort(reverse=True)
>>> a
[5, 4, 3, 1, 1]

用‘key’参数指定排序的依据字段

‘key’参数是个函数

如果要指定字段,可以用‘key’参数。‘key’参数是一个函数,指定要比较的是list中对象的哪个字段;比如下面的例子,a的内容是一个turple:

>>> a = [(1,9,3), (4,19,5), (2,6,1)]
>>> def key_func(t): return t[1]
...
>>> a.sort(key=key_func)
>>> a
[(2, 6, 1), (1, 9, 3), (4, 19, 5)]

key_func函数取tuple中的第二个返回,所以在‘sort’方法中就是以list内容中的第二个值进行排序的;

‘key’参数是个lambda表达式

为了简化,我们还可以用lambda表达式来定义key参数,下面的例子没有定义函数而是用lambda,结果和上面的例子一样的:

>>> a = [(1,9,3), (4,19,5), (2,6,1)]
>>> a.sort(key=lambda t: t[1])
>>> a
[(2, 6, 1), (1, 9, 3), (4, 19, 5)]

‘key’参数是python自带的itemgetter()函数

实际上,因为这种操作太常用,python里面还专门定义了一个方法itemgetter()来做这种事情,下面的例子没有定义函数,也没有用lambda,而是用的itemgetter()。结果和上面的例子一样的:

>>> from operator import itemgetter
>>> a = [(1,9,3), (4,19,5), (2,6,1)]
>>> a.sort(key=itemgetter(1), reverse=True)
>>> a
[(4, 19, 5), (1, 9, 3), (2, 6, 1)]
>>> a.sort(key=itemgetter(0), reverse=True)
>>> a
[(4, 19, 5), (2, 6, 1), (1, 9, 3)]

同理,python里面还定义了attrgetter()用来对python对象指定字段来排序

用‘cmp_to_key()’函数来自定义排序规则

更复杂一些,如果我们想完全自定义排序办法,类似java中通过排序方法来对列表进行排序的话,python中也有解决办法:

from functools import cmp_to_key
a = [(1, 6), (2, 3), (3, 4), (1, 2)]
>>> a.sort(key=cmp_to_key(lambda x, y: -1 if x[0] + x[1] < y[0] + y[1] else 1))
>>> a
[(1, 2), (2, 3), (3, 4), (1, 6)]

虽然用到cmp_to_key的机会相对没那么多,但是这个是一个非常有用的排序方法,目的是将排序方法决定权完全交给自己。比如上面的例子,我们的list列表里面是一些turple对象,我们需要根据turple里面数字的和来排序,就可以用上面的cmp_to_key加上自定义函数或者lambda表达式来实现。

注:lambda表达式实际可以看出函数的一个简单写法,让代码更简洁,可读性更高。

sorted()函数

sorted()函数与list.sort()使用方法基本类似,区别在于sorted()函数需要带一个list作为参数,而list.sort()本身就是list对象的方法,不需要再带list参数。

>>> a = [1,2,3,4,5]
>>> sorted(a, reverse=True)
[5, 4, 3, 2, 1]
>>>

多维列表list

到现在为止我们只是生成了内容是单一值的列表。如果list里面的内容又是一个列表,那么我们可以叫它多维列表

>>> a = [[1,2,3], [4,5,6], [i for i in range(7, 10)]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

多维列表一样可以通过方括号访问里面的内容,不过内容本身也是一个列表而已

>>> a[0]
[1, 2, 3]

下面列子访问多维列表中第一个列表中的第二个值:

>>> a = [[1,2,3], [4,5,6], [i for i in range(7, 10)]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> a[0][1]
2

总结:

python的list列表是一个非常基本,也是非常有用的一个数据结构。它的用法再次阐释了python语法的简洁,强大。掌握了python list列表的用法,可以极大的提高开发效率;