BLOG
Enjoy when you can, and endure when you must.
DEC 06, 2013/Python
Python列表分片与技巧

Python的列表是很常用的数据类型。列表是有序的,因此支持类似Python字符串对象中的大部分操作方式。并且因为列表属于可变数据类型,因此还可以支持原处修改。本文主要关注列表的分片操作。

通过偏移量来获取列表中对应位置的元素是列表最基本的操作:

>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[2]
2

当需要获取列表中的一个子部分,就需要使用分片方法,即通过L[x:y]取得并返回列表L在偏移量x到y之间的一个新列表,如下所示:

>>> l[2:8]
[2, 3, 4, 5, 6, 7]

另外,如果偏移量留空,则第一个偏移量默认为列表的头部,第二个默认为末尾:

>>> l[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如果这样做,相当于对原列表做一个浅拷贝。

分片实际还接收第三个参数,其代表步长,默认情况下,该值为1。下面将步长改为3:

>>> l[::3]
[0, 3, 6, 9]

如果把步长设为负值会有什么效果呢?

>>> l[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

是不是很有意思,特别是这里-1的情况相当于反转列表。

接下来来看一个实际的需求。假设有如下列表:

>>> l
['one', 1, 'two', 2, 'three', 3, 'four', 4, 'five', 5]

现在我们要创建一个字典,并将以上列表中的元素交替作为键和值。利用刚才分片的技巧可以很方便的做到:

>>> l_odd = l[::2]
>>> l_even = l[1::2]
>>> l_odd
['one', 'two', 'three', 'four', 'five']
>>> l_even
[1, 2, 3, 4, 5]
>>> d = dict(zip(l_odd, l_even))
>>> d
{'four': 4, 'three': 3, 'five': 5, 'two': 2, 'one': 1}

分片 + 打包,快速解决问题!

COMMENTS
LEAVE COMMNT