Python 序列类型 list,tuple,range 使用说明
Python 序列类型
Python 中存在很多的序列(Sequence
)类型,比如str
,bytes
,list
,tuple
,range
。其中列表list
继承自MutableSequence
,为可变序列,元组tuple
和区域range
继承自Sequence
,为不可变序列。
判断 Python 序列是否相等的规则
对于类型相同的两个 Python 序列,如果他们的长度一样,每一个位置的元素相等,则这两个序列是相等(==
)的。
文本/字符串类型
想要详细了解 Python 字符串类型,你可以查看Python 文本/字符串类型 str 使用说明一节。
Python list 类型
Python 中的列表list
,可以通过[]
来创建,[]
中为列表的元素,元素之间使用,
进行分隔。
除了[]
,你还可以通过list
类型的构造器来创建 Python 列表,他的形式如下。
list([iterable], /)
- iterable 参数
iterable
参数是一个迭代器对象,迭代器中的元素将依次包含在 Python 列表中。如果未指定该参数,则返回一个空列表。
另外,使用推导式可以让创建列表变得更为简单,语法格式为y for x in iterable
,其中iterable
为迭代器对象,x
表示迭代器中的元素,y
为一个表达式,一般会通过x
产生新的值。
[1, 2, 3]
[1, 2, 3]
list((1, 2, 3))
[1, 2, 3]
[x + 100 for x in (1, 2, 3)]
[101, 102, 103]
对 Python 列表中的元素进行排序
使用 Python 的sorted
函数,或列表对象的sort
方法,可以对列表中的元素进行排序,两种方式的区别在于,sorted
函数会将排序的结果作为新的列表返回。
sorted(iterable, /, *, key=None, reverse=False)
sort(*, key=None, reverse=False)
- iterable 参数
iterable
参数是一个迭代器对象,迭代器中的元素将参与排序。- key 参数
key
参数是一个函数或方法,其参数表示序列中的元素,其返回值表示真正用于比较的内容,这对于复杂对象是有效的。假设列表的元素是Student
类的实例,我们可以通过key
参数指示按照其id
进行排序。- reverse 参数
reverse
参数默认为False
,表示升序排序,如果为True
,则表示降序排序。
在下面的交互模式中,'A'
在排序后成为了列表的第一个元素,将str
类型的upper
方法传递给参数key
,对比内容被改为大写字母,因此位置不再发生变化。
l = ['a', 'A', 'c']
l.sort()
l
['A', 'a', 'c']
l = ['a', 'A', 'c']
l.sort(key=str.upper)
l
['a', 'A', 'c']
Python tuple 类型
Python 中的元组tuple
,可以通过()
来创建,()
中为元组的元素,元素之间使用,
进行分隔。与列表不同,元组在创建之后不能修改。
创建 Python 元组时可以省略 ()
事实上,要创建一个 Python 元组仅需要使用,
,左右两边的括号是可以省略的,书写1,2,3
与书写(1,2,3)
的效果是相同的。
不过,还是建议将()
保留,以避免产生意想不到的问题,比如fun(1,2)
和fun((1,2))
,第一个函数调用中的1,2
会被视为两个参数,而不是一个元组。
使用 , 确保创建 Python 元组的表达式没有歧义
当你创建只有一个元素的元组时,可以在元素后添加,
,否则表达式的计算结果可能是元素对应的值,而非一个元组。比如,(1)
返回的结果为1
。
除了()
,你还可以通过tuple
类型的构造器来创建 Python 元组,他的形式如下。
tuple([iterable], /)
- iterable 参数
iterable
参数是一个迭代器对象,迭代器中的元素将依次包含在 Python 元组中。如果未指定该参数,则返回一个空元组。
1,
(1,)
tuple([1, 2, 3])
(1, 2, 3)
Python range 类型
Python 中的区域range
,并不像列表和元组一样包含具体的元素,range
仅包含一些信息,用于描述一个有规律的整数序列,通常情况下这些整数会被用于循环。
要创建range
对象,需要使用range
类型的构造器,他具有以下两种形式。
range(stop, /)
range(start, stop, step=1, /)
- start 参数
start
参数表示整数序列中的第一个整数,默认为0
。- stop 参数
stop
参数用于限定序列最后一个整数的大小,如果step
为正数,则最后一个整数需要小于stop
,如果step
为负数,则最后一个整数需要大于stop
。- step 参数
step
参数表示了序列中两个整数的间距大小,默认为1
。如果设置为0
,将引发异常ValueError
。
对于 Python 3.3 以及更高的版本,上述三个参数start
,stop
和step
,在成功创建range
对象后,其信息将保留在对应的属性start
,stop
和step
中。
判断 Python range 对象相等的规则
两个range
对象是否相等(==
),取决于他们表示的整数序列是否相等,而不是start
,stop
,step
属性是否相等。比如,range(1,5,3)
和range(1,6,3)
相等,因为他们的长度相同,都包含了1
和4
,并且顺序一致。
[x for x in range(3)]
[0, 1, 2]
tuple(range(10, 3, -2))
(10, 8, 6, 4)
range(0) == range(0, 0, -3)
True
获取 Python 列表,元组,区域中的元素
使用索引和切片表达式,你可以轻松获取 Python 列表,元组,区域(range
)的某个或某些元素,他们的书写方式有s[i]
,s[i:j]
,s[i:j:k]
。
其中,i
,j
为元素的索引,用于界定切片的范围,i
指示切片的开始位置,j
指示切片的停止位置,停止位置的元素不会被包含在切片中,如果停止位置存在元素的话。k
为步长,不能为0
,未指定或为None
时将作为1
处理。
根据k
的正负情况,i
指示的位置应该在j
指示位置的左边或右边,否则会返回一个空切片。当i
,j
未指定或为None
时,切片会尝试包含序列两端的所有元素。
Python 列表,元组,区域中第一个和最后一个元素的索引
对于 Python 列表,元组,区域的第一个元素,其索引为0
。对于 Python 列表,元组,区域的最后一个元素,其索引可用-1
表示,倒数第二个元素的索引为-2
,以此类推。
(1, 2, 3, 4, 5)[-1]
5
(1, 2, 3, 4, 5)[-2:1:-1]
(4, 3)
(1, 2, 3, 4, 5)[:]
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)[100:-100:-2]
(5, 3, 1)
查找 Python 列表,元组,区域中的元素
对于元素的查找,Python 列表,元组,区域(range
)提供了如下方法。
count
方法用于获取指定元素在序列中出现的次数。
count(value, /)
- value 参数
value
参数为需要计算出现次数的元素。
index
方法用于获取指定元素在序列中的索引,如果元素不存在,则将引发异常ValueError
。
index(value[, start[, stop]], /)
- value 参数
value
参数为需要计算索引的元素。- start,stop 参数
start
和stop
参数用于序列的切片操作,如果value
指定的元素不在切片范围内,则会引发异常ValueError
。
['a', 'b', 'b'].count('b')
2
(1, 'a', 1.3).index('a')
1
获取 Python 列表,元组,区域中元素的个数
Python 中的函数len
,可用于获取列表,元组,区域(range
)的元素个数,比如,len(range(3))
的运算结果为3
。
判断 Python 列表,元组,区域中是否存在某个元素
使用x in s
或x not in s
,可以判断列表,元组,区域(range
)中是否存在或不存在某个元素,x
为需要判断的元素,s
为序列对象。
1 in [0, 1, 2]
True
1 not in (0, 1, 2)
False
获取 Python 列表,元组,区域中的最大值和最小值
Python 中的函数max
,min
,可用于获取列表,元组,区域(range
)中的最大值和最小值,比如,max([1,3,2])
的运算结果为3
,min((1,3,2))
的运算结果为1
。
反转 Python 列表,元组,区域
使用 Python 列表的reverse
方法,可以将列表中的元素顺序反转,需要指出,这会直接影响原有列表,而不是产生新的列表对象。
如果你不希望影响原有列表,那么可以使用reversed
函数,将反转的结果保存在迭代器中,然后通过迭代器创建一个新列表。或者,先使用copy
方法对原有列表进行复制。
除了列表,reversed
函数同样适用于元组和区域(range
)。
l = [1, 2, 3]
l.reverse()
l
[3, 2, 1]
tuple(reversed((1, 2)))
(2, 1)
联接 Python 列表,元组,区域
在 Python 中,你可以使用+
或*
,对列表,元组,区域(range
)进行联接或自我联接,他们的书写方式为s+t
,s*n
,n*s
。其中s
和t
需要是类型相同的两个序列对象,否则会引发异常。n
为自我联接的次数,大于1
时才有实际效果,如果次数小于等于0
,则会生成一个类型相同的空序列。
(1, 2) * 2
(1, 2, 1, 2)
(1, 2) * -1
()
使用 + 或 * 联接 Python 列表,元组,区域会产生新的实例
无论是使用+
还是*
进行联接,原有的操作数都不会受到影响,运算结果将作为新的序列对象返回。
Python 列表,元组中的元素可能指向同一个对象
类似于([],)*2
这样的表达式是很容易让人误解的,虽然其运算结果被表述为([],[])
,但元组的两个元素指向了同一个列表,而不是两个不同的列表。因为([],)
作为操作数被优先计算,元组的唯一元素保持了对列表的引用,在*2
进行自我联接后,第二个元素与第一个元素将保持相同的引用。
在下面的交互模式中,为列表添加数字123
后,两个元素的显示信息均发生了变化。
t = ([],) * 2
t
([], [])
t[0].append(123)
t
([123], [123])
添加和插入 Python 列表元素
對於元素的添加和插入,Python 串列提供了如下方法。
append
方法用于在列表的末尾添加元素。
insert
方法用于在列表的某一位置插入元素。
append(object, /)
insert(index, object, /)
- object 参数
object
参数为需要添加或插入的元素。- index 参数
index
参数是一个索引,该索引对应的位置将被插入元素。当index
表示的索引无效时,元素会被添加至列表末尾。
l = []
l.append(1)
l.insert(0, 2)
l
[2, 1]
替换和删除 Python 列表中的元素
你可以使用之前讲述的切片表达式,来替换 Python 列表中的元素,他们的书写方式有s[i]=x
,s[i:j]=t
,s[i:j:k]=t
。
其中,x
为替换的新元素,t
为包含新元素的迭代器,切片表达式对应的旧元素会被删除,新元素将在第一个旧元素的位置被依次添加。如果步长k
最终未被视为1
,则删除的旧元素和添加的新元素的个数必须相同,否则删除的旧元素和添加的新元素的个数不必相同。
使用del
关键字或空的迭代器,你可以删除 Python 列表中的某个或切片包含的元素,他们的书写方式有del s[i]
,del s[i:j]
,del s[i:j:k]
,s[i:j]=()
,s[i:j]=[]
等。
此外,列表的remove
方法可用于删除指定的元素,删除操作仅执行一次。
列表的pop
方法,同样可用于删除列表中指定索引位置的元素,但他会将被删除的元素作为返回值返回。
列表的clear
方法可用于删除列表中的所有元素。
remove(value, /)
- value 参数
value
参数为需要被删除的元素,如果他不存在,则将引发异常ValueError
。
pop(index=-1, /)
- index 参数
index
参数为需要删除并返回的元素的索引,默认为-1
,也就是最后一个元素的索引。当index
表示的索引无效时,将引发异常IndexError
,这包括列表长度为0
的情况。
l = [1, 2, 3, 4, 5, 6]
l[0:2] = ('a', 'b', 'c')
l
['a', 'b', 'c', 3, 4, 5, 6]
del l[-1:-5:-1]
l
['a', 'b', 'c']
l.remove('b')
l
['a', 'c']
l.pop(0)
'a'
复制 Python 列表
使用 Python 列表的copy
方法,可以对列表进行复制,并产生一个新的列表,这种复制属于阴影复制,复制的列表与被复制的列表互不影响,但两个列表中的元素仍可能保持对同一对象的引用。
a = [1, 2, 3]
b = a.copy()
a.clear()
a
[]
b
[1, 2, 3]
拓展 Python 列表
使用+=
,*=
,你可以进行拓展和自我拓展,他们的书写方式为s+=t
,s*=n
。其中s
为序列对象,t
为包含元素的迭代器对象。n
为自我拓展的次数,大于1
时才有实际效果,如果次数小于等于0
,列表中的元素将被清空。
此外,列表的extend
方法也可以实现列表的拓展,他的效果与s+=t
一致。
extend(iterable, /)
- iterable 参数
iterable
参数是一个迭代器对象,迭代器中的元素将被依次添加至列表末尾。
l = [1, 2]
l += range(3, 9)
l
[1, 2, 3, 4, 5, 6, 7, 8]