python 序列类型(list, tuple, range)
有三种基本序列类型:
- list
- tuple
- range
通用序列操作
| 运算 | 结果 |
|---|---|
| x in s | 如果 s 中的某项等于 x 则结果为 True,否则为 False |
| x not in s | 如果 s 中的某项等于 x 则结果为 False,否则为 True |
| s + t | s 与 t 相拼接 |
| s n 或 n s | 相当于 s 与自身进行 n 次拼接 |
| s[i] | s 的第 i 项,起始为 0 |
| s[i:j] | s 从 i 到 j 的切片 |
| s[i:j:k] | s 从 i 到 j 步长为 k 的切片 |
| len(s) | s 的长度 |
| min(s) | s 的最小项 |
| max(s) | s 的最大项 |
| s.index(x[, i[, j]]) | x 在 s 中首次出现项的索引号(索引号在 i 或其后且在 j 之前) |
| s.count(x) | x 在 s 中出现的总次数 |
可变序列操作
| 运算 | 结果 |
|---|---|
| s[i] = x | 将 s 的第 i 项替换为 x |
| s[i:j] = t | 将 s 从 i 到 j 的切片替换为可迭代对象 t 的内容 |
| del s[i:j] | 等同于 s[i:j] = [] |
| s[i:j:k] = t | 将 s[i:j:k] 的元素替换为 t 的元素 |
| del s[i:j:k] | 从列表中移除 s[i:j:k] 的元素 |
| s.append(x) | 将 x 添加到序列的末尾 (等同于 s[len(s):len(s)] = [x]) |
| s.clear() | 从 s 中移除所有项 (等同于 del s[:]) |
| s.copy() | 创建 s 的浅拷贝 (等同于 s[:]) |
| s.extend(t) 或 s += t | 用 t 的内容扩展 s (基本上等同于 s[len(s):len(s)] = t) |
| s *= n | 使用 s 的内容重复 n 次来对其进行更新 |
| s.insert(i, x) | 在由 i 给出的索引位置将 x 插入 s (等同于 s[i:i] = [x]) |
| s.pop([i]) | 提取在 i 位置上的项,并将其从 s 中移除 |
| s.remove(x) | 删除 s 中第一个 s[i] 等于 x 的项目。 |
| s.reverse() | 就地将列表中的元素逆序。 |
列表
列表是可变序列,通常用于存放同类项目的集合(其中精确的相似程度将根据应用而变化)。
class list([iterable])
可以用多种方式构建列表:
- 使用一对方括号来表示空列表:
[] - 使用方括号,其中的项以逗号分隔:
[a], [a, b, c] - 使用列表推导式:
[x for x in iterable] - 使用类型的构造器:
list() # 或 list(iterable)
构造器将构造一个列表,其中的项与 iterable 中的项具有相同的的值与顺序。 iterable 可以是序列、支持迭代的容器或其它可迭代对象。 如果 iterable 已经是一个列表,将创建并返回其副本,类似于 iterable[:]。 例如,list(‘abc’) 返回 [‘a’, ‘b’, ‘c’] 而 list( (1, 2, 3) ) 返回 [1, 2, 3]。 如果没有给出参数,构造器将创建一个空列表 []。
其它许多操作也会产生列表,包括 sorted() 内置函数。
列表实现了所有 一般 和 可变 序列的操作。 列表还额外提供了以下方法:
sort(*, key=None, reverse=False)
此方法会对列表进行原地排序,只使用 < 来进行各项间比较。 异常不会被屏蔽 —— 如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。
key指定带有一个参数的函数,用于从每个列表元素中提取比较键 (例如 key=str.lower)。 对应于列表中每一项的键会被计算一次,然后在整个排序过程中使用。 默认值 None 表示直接对列表项排序而不计算一个单独的键值。reverse为一个布尔值。 如果设为 True,则每个列表元素将按反向顺序比较进行排序。
>>> arr = [5, 3, 1, 2, 4] # 默认排序,升序
>>> arr.sort()
[1, 2, 3, 4, 5]
>>> arr = [5, 3, 1, 2, 4] # 降序排卵
>>> arr.sort(reverse = True)
>>> print(arr)
[5, 4, 3, 2, 1]
使用指定key进行排序
# 获取列表的第二个元素
def takeSecond(elem):
return elem[1]
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二个元素排序
random.sort(key=takeSecond)
# 输出类别
print '排序列表:', random
输出结果:
排序列表:[(4, 1), (2, 2), (1, 3), (3, 4)]
元组
元组是不可变序列,通常用于储存异构数据的多项集(例如由 enumerate() 内置函数所产生的二元组)。 元组也被用于需要同构数据的不可变序列的情况(例如允许存储到 set 或 dict 的实例)。
class tuple([iterable])
可以用多种方式构建元组:
使用一对圆括号来表示空元组: ()
>>> t = () >>> t ()使用一个后缀的逗号来表示单元组: a, 或 (a,)
>>> t = 1, >>> t (1,)使用以逗号分隔的多个项: a, b, c or (a, b, c)
>>> t = 1, 2, 3 >>> t (1, 2, 3)使用内置的 tuple(): tuple() 或 tuple(iterable)
# 如果没有给出参数,构造器将创建一个空元组 ()。 >>> t = tuple() >>> t () # >>> t = tuple([1, 2, 3]) >>> t (1, 2, 3)
构造器将构造一个元组,其中的项与 iterable 中的项具有相同的值与顺序。 iterable 可以是序列、支持迭代的容器或其他可迭代对象。 如果 iterable 已经是一个元组,会不加改变地将其返回。 例如,tuple(‘abc’) 返回 (‘a’, ‘b’, ‘c’)
>>> tuple('abcd')
('a', 'b', 'c', 'd')
请注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。 例如,f(a, b, c) 是在调用函数时附带三个参数,而 f((a, b, c)) 则是在调用函数时附带一个三元组。
元组实现了所有 一般 序列的操作。
对于通过名称访问相比通过索引访问更清晰的异构数据多项集,collections.namedtuple() 可能是比简单元组对象更为合适的选择。
range 对象
range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。
class range(stop)
class range(start, stop[, step])
range 构造器的参数必须为整数(可以是内置的 int 或任何实现了 index 特殊方法的对象)。
start形参的值 (如果该形参未提供则为 0)stop形参的值step形参的值 (如果该形参未提供则为 1)如果省略 step 参数,其默认值为 1。
如果 step 为正值,确定 range r 内容的公式为 r[i] = start + step*i 其中 i >= 0 且 r[i] < stop。
如果 step 为负值,确定 range 内容的公式仍然为 r[i] = start + step*i,但限制条件改为 i >= 0 且 r[i] > stop.
如果省略 start 参数,其默认值为 0,如果 step 为零则会引发 ValueError。
如果 r[0] 不符合值的限制条件,则该 range 对象为空。 range 对象确实支持负索引,但是会将其解读为从正索引所确定的序列的末尾开始索引。
元素绝对值大于 sys.maxsize 的 range 对象是被允许的,但某些特性 (例如 len()) 可能引发 OverflowError。
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]
range 对象实现了 一般 序列的所有操作,但拼接和重复除外(这是由于 range 对象只能表示符合严格模式的序列,而重复和拼接通常都会违反这样的模式)。
range 类型相比常规 list 或 tuple 的优势在于一个 range 对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了 start, stop 和 step 值,并会根据需要计算具体单项或子范围的值)。
range 对象实现了 collections.abc.Sequence ABC,提供如包含检测、元素索引查找、切片等特性,并支持负索引 (参见 序列类型 —- list, tuple, range):
>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18
使用 == 和 != 检测 range 对象是否相等是将其作为序列来比较。 也就是说,如果两个 range 对象表示相同的值序列就认为它们是相等的。 (请注意比较结果相等的两个 range 对象可能会具有不同的 start, stop 和 step 属性,例如 range(0) == range(2, 1, 3) 而 range(0, 3, 2) == range(0, 4, 2)。)
在 3.2 版更改: 实现 Sequence ABC。 支持切片和负数索引。 使用 int 对象在固定时间内进行成员检测,而不是逐一迭代所有项。
在 3.3 版更改: 定义 ‘==’ 和 ‘!=’ 以根据 range 对象所定义的值序列来进行比较(而不是根据对象的标识)。
3.3 新版功能: start, stop 和 step 属性。

