Python序列类型list、tuple、range的使用方法

Python共有三种基本的序列类型:listtuplerange对象。

列表

列表用于保存同一类型的变量。

创建列表

列表可以通过以下方式创建:

列表使用方括号创建,用逗号分隔项。例如:

letters = ['A','B','C','D','E','F','G']
weeks = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
empty = [] #空列表

你还可以使用列表推导式来创建列表:[x for x in iterable],例如[s for s in (1,2,3,4)]返回[1, 2, 3, 4]

你也可以使用列表类型构造函数:list()list(iterable)创建列表。它的项与传入的参数iterable的项相同且顺序也相同。 iterable可以是一个序列、一个支持迭代的容器或一个迭代器对象。 如果iterable已经是一个列表,则创建并返回它的一个副本。 例如,list('abc') 返回 ['a', 'b', 'c'] 并且 list((1, 2, 3)) 返回[1, 2, 3]。 如果没有给出参数,构造函数会创建一个新的空列表[]

访问列表元素

列表中的每个值都有对应的位置,称之为索引,第一个值的索引是0,第二个值的索引是1,依此类推。您可以通过索引访问列表的值。

weeks = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
print(weeks[0])
print(weeks[3])
print(weeks[-2])

执行如下程序,将输出如下结果:

'Sunday'
'Thursday'
'Saturday'

如上例所示,索引也可以从尾部开始,最后一个元素的索引为-1,倒数第二个元素的索引为-2,以此类推。

Python不支持非常灵活的截取列表的方法:

letters = ['A','B','C','D','E','F','G']
print(letters[1:-2])
print(letters[3:])
print(letters[::2])

执行如上程序,将输出如下结果:

['B', 'C', 'D', 'E']
['D', 'E', 'F', 'G']
['A', 'C', 'E', 'G']

如上例所示,实际上使用了s[i:j]的形式来截取列表s,表示截取列表s从索引i到索引j的子列表,返回一个子列表。索引i和索引j也可以省略不传,分别表示头从开始截取和截取到末尾。letters[3:]表示载取从索引3到末尾的子列表。

您还可以使用s[i:j:K]的形式截取列表s从索引i到索引j的每隔k元素取一个元素形成的子列表,letters[::2]表示截取整个列表每隔2个元素取一个元素形成的子列表。

列表还支持使用类似堆栈的取数形式s.pop(i),返回列表s索引i处的元素,并删除此元素。

letters = ['A','B','C','D','E','F','G']
print(letters.pop(1))
print(letters)
print(letters.pop())
print(letters)

执行如上程序,将输出如下结果:

B
['A', 'C', 'D', 'E', 'F', 'G']
G
['A', 'C', 'D', 'E', 'F']

使用x in s 可以判断x是否s列表的元素。类似地,x not in s也可以判断x是否s列表的元素,返回真x in s相反。

修改列表元素的值

您可以直接对列表的元素进行修改:

letters = ['A','B','C','D','E','F','G']
letters[0]='a'
print(letters)

执行如上程序,将输出如下结果:

['a', 'B', 'C', 'D', 'E', 'F', 'G']

Python还支持使用s[i:j] = t的形式,把列表s从索引i到索引j(不包括)替换为列表t的对应元素。

letters = ['A','B','C','D','E','F','G']
letters[0:3]=['a','b','c']
print(letters)
letters[3:5]=['de']
print(letters)
letters[4:]=[]
print(letters)

执行如上程序,将输出如下结果:

['a', 'b', 'c', 'D', 'E', 'F', 'G']
['a', 'b', 'c', 'de', 'F', 'G']
['a', 'b', 'c', 'de']

添加删除列表元素

列表提供了append(element)方法,将参数element添加到元素的末尾。

letters = ['A','B','C','D','E','F','G']
letters.append("H")
print(letters)

执行如上程序,将输出如下结果:

['A','B','C','D','E','F','G','H']

append方法与s[len(s):len(s)] = [x]的效果相同。s是列表变量,x表示要添加的元素。

append方法只能在列表的末尾添加元素,如果你想在其它位置插入元素,您可以调用insert(i, x)方法。其中i要插入到的索引,x表示要插入的元素。

letters = ['A','B','C','D','E','F','G']
letters.append(0, "Z")
print(letters)

执行如上程序,将输出如下结果:

['Z','A','B','C','D','E','F','G']

在列表指定位置插入元素也可以使用s[i:i] = [x]实现。

列表还有一种操作:拼接,也可以变相实现向列表添加元素的功能。s + tst都是列表,+操作符可以得到一个包含st的所有元素的列表。

letters1 = ['A','B','C','D','E','F','G']
letters2 = ['H','I','J','K','L','M','N']
letters3 = letters1 + letters2
print(letters3)

执行如上程序,将输出如下结果:

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N']

还有一种使用重复元素生成列表的方法:s * ns是一个列表,n是一个整数。此表达式的作用是使用列表s的元素重复n次生成一个新的列表。

letters1 = ['A','B','C']
letters2 = letters1 * 3
print(letters2)

执行如上程序,将输出如下结果:

['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']

s * n 等效于 n * s

从列表中删除元素

使用del s[i]可以删除列表s中索引i处于的元素

letters = ['A','B','C','D','E','F','G']
del letters[1]
print(letters)

执行如上程序,将输出如下结果:

['A','B','D','E','F','G']

同样,可以使用del s[i:j],del s[i:j:k]从列表中删除一定范围的元素。

del s[i:j] 等效于 s[i:j] = []

以上方法都是按序引删除元素,remove(x)用于删除第一个值等于x的元素。

s.clear()用于删除列表的所有元素,等效于s[i:i] = [x]

其实列表的很多特性都是序列类型共有的。

常用的序列操作

大多数序列类型都支持下表中的操作,在表中,st是相同类型的序列,nijk是整数,xs的组成部分。

运算和操作 结果 描述和示例
x in s 如果s的一项等于x,则为真,否则为假 用作包含测试,当s的类型为strbytesbytearray也可以用于检测子序列。例如如"ch" in "school"结果为True
x not in s 如果s的一项等于x,则为真,否则为假 in类似
s + t 拼接列表st 连接不可变序列总是会产生一个新对象,会带来较大的开销。有的序列类型不支持拼接,如Range
s * nn * s s加到自己上,加n 有的序列类型不支持此操作,如Range
s[i] 列表s的索引i处的值 负数索引表示从尾部开始计数,-0除外,它与0相同
s[i:j] 列表sij的切片
s[i:j:k] 列表sij的切片每隔k个元素取一下
len(s) 列表s的长度
min(s) 列表s的最小元素
max(s) 列表s的最大元素
s.index(x[, i[, j]]) 列表s(索引从ij)的每一个等于x的元素的索引
s.count(x) 列表中所有等于x的元素的个数

可变序列类型和不可变序列类型

tuplerange,string是不可变序列类型,list是可变序列类型

Typle类型

中文名为元组类型,Typle类型是不可变序列类型,通常用于存储几种不同类别的数据。

Typle类型使用逗号分隔的多个值或变量声明a, b,它等效于(a,b)。只包含一个元素的元组使用a(a,)表示。空元组

元组实现了前面讲的序列类型的的共有特性。

元组只能使用下标访问元素,Python的collections模块下的namedtuple类型支持使用名称访问元素。

Range类型

Range类型是一个不可变的序列类型,通常用于在for循环中指定循环次数。

Range类型可以使用range(stop)形式的声明,参数stop表示Range实例元素的最大值。些声明返回的Range实例元素从0开始,最大值为stop

您还可以指定开始值(start)和步长(step):range(start, stop[, step])

>>> 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]

Range实现了前面讲的序列类型的共有特性。

范围类型相对于常规列表或元组的优势在于范围对象将始终占用相同(小)内存量,无论它表示的范围大小如何(因为它只存储开始、停止和步长值 ,根据需要计算每个元素和子范围)。