列表
与元组对比,列表的长度可变、内容可以被修改。你可以用方括号定义,或用list
函数:
操作列表:
增添:append方法,insert方法,list.extend(list)
删除:del方法,pop方法,remove方法
判断元素是否在列表内:in方法
排序:sorted(list),list.sort()。
二分搜索和维护已排序的列表
bisect
模块支持二分查找,和向已排序的列表插入值。bisect.bisect
可以找到插入值后仍保证排序的位置,bisect.insort
是向这个位置插入值:
重点解释一下:
python
import bisect
a = [1, 3, 4, 4, 7, 8]
x = 4
# 查找插入点
index = bisect.bisect(a, x)
print(index) # 输出 4
在这个例子中,列表 a
是 [1, 3, 4, 4, 7, 8]
,我们查找 4
的插入点。由于 bisect
默认是右查找,因此返回索引 4
,表示如果插入 4
,它会位于列表中已经存在的最后一个 4
之后。所以,是把你需要的数值后一位插入位置(index),帮助你找出来。
注意:bisect
模块不会检查列表是否已排好序,进行检查的话会耗费大量计算。因此,对未排序的列表使用bisect
不会产生错误,但结果不一定正确。
enumerate函数
Python内建了一个enumerate
函数,可以返回(i, value)
元组序列:
python
for i, value in enumerate(collection):
# do something with value
当你索引数据时,使用enumerate
的一个好方法是计算序列(唯一的)dict
映射到位置的值:
python
In [83]: some_list = ['foo', 'bar', 'baz']
In [84]: mapping = {}
In [85]: for i, v in enumerate(some_list):
....: mapping[v] = i
In [86]: mapping
Out[86]: {'bar': 1, 'baz': 2, 'foo': 0}
zip函数
zip
可以将多个列表、元组或其它序列成对组合成一个元组列表:
python
In [89]: seq1 = ['foo', 'bar', 'baz']
In [90]: seq2 = ['one', 'two', 'three']
In [91]: zipped = zip(seq1, seq2)
In [92]: list(zipped)
Out[92]: [('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
zip
可以处理任意多的序列,元素的个数取决于最短的序列:
python
In [93]: seq3 = [False, True]
In [94]: list(zip(seq1, seq2, seq3))
Out[94]: [('foo', 'one', False), ('bar', 'two', True)]
给出一个"被压缩的"序列,zip
可以被用来解压序列。也可以当作把行的列表转换为列的列表。这个方法看起来有点神奇:
python
In [96]: pitchers = [('Nolan', 'Ryan'), ('Roger', 'Clemens'),
....: ('Schilling', 'Curt')]
In [97]: first_names, last_names = zip(*pitchers)
In [98]: first_names
Out[98]: ('Nolan', 'Roger', 'Schilling')
In [99]: last_names
Out[99]: ('Ryan', 'Clemens', 'Curt')
重点参考来源: