3.1.3 List 列表
Python 中可以通过组合一些值得到多种 复合 数据类型。其中最常用的 列表 ,可以通过方括号括起、逗号分隔的一组值(元素)得到。一个 列表 可以包含不同类型的元素,但通常使用时各个元素类型相同:
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
和字符串(以及各种内置的 sequence 类型)一样,列表也支持索引和切片:
>>> squares[0] # indexing returns the item
1
>>> squares[-1]
25
>>> squares[-3:] # slicing returns a new list
[9, 16, 25]
还是和上次一样,在这里面解释一下什么是sequence 类型?
sequence – 序列
一种 iterable,它支持通过 getitem()
特殊方法来使用整数索引进行高效的元素访问,并定义了一个返回序列长度的__len__() 方法。内置的序列类型有 list、str、tuple和 bytes。注意虽然 dict 也支持 getitem() 和 len(),但它被认为属于映射而非序列,因为它查找时使用任意的 immutable 键而非整数。
collections.abc.Sequence 抽象基类定义了一个更丰富的接口,它在 getitem() 和 len()之外又添加了 count(), index(), contains() 和 reversed()。实现此扩展接口的类型可以使用 register() 来显式地注册。
所有的切片操作都返回一个包含所请求元素的新列表。 这意味着以下切片操作会返回列表的一个 浅拷贝:
>>> squares[:]
[1, 4, 9, 16, 25]
列表同样支持拼接操作:
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
与 immutable 的字符串不同, 列表是一个 mutable 类型,就是说,它自己的内容可以改变:
>>> cubes = [1, 8, 27, 65, 125] # something's wrong here
>>> 4 ** 3 # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64 # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]
解释一下mutable–可变类型,与immutable–不可变类型对应。
mutable – 可变
可变对象可以在其 id()保持固定的情况下改变其取值。将是一个固定的内容空间,不会更改内存地址。
你也可以在列表末尾通过 append() 方法 来添加新元素(我们将在后面介绍有关方法的详情):
>>> cubes.append(216) # add the cube of 6
>>> cubes.append(7 ** 3) # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
给切片赋值也是可以的,这样甚至可以改变列表大小,或者把列表整个清空:
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> letters[:] = []
>>> letters
[]
内置函数 len() 也可以作用到列表上:
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
也可以嵌套列表 (创建包含其他列表的列表), 比如说:
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
到这里就结束了吗?
这还没有完,接下来会更加精彩!
我们先可视再化理解一下List列表
首先还是要搞清楚List列表的原理,与字符串的索引一样,列表索引从 0 开始,第二个索引是 1,依此类推。
通过索引列表可以进行截取、组合等操作。
list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[0] )
print( list[1] )
print( list[2] )
结果:
red
green
blue
索引也可以从尾部开始,最后一个元素的索引为 -1,往前一位为 -2,以此类推。
list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[-1] )
print( list[-2] )
print( list[-3] )
结果:
black
white
yellow
使用下标索引来访问列表中的值,同样你也可以使用方括号 [] 的形式截取字符,如下所示:
nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(nums[0:4])
结果:
[10, 20, 30, 40]
List所包含的各种方法
序号 | 方法 | 解释 | 参数 | 返回值 |
---|---|---|---|---|
1 | list.append(obj) | 方法用于在列表末尾添加新的对象。 | obj – 添加到列表末尾的对象 | 该方法无返回值,但是会修改原来的列表。 |
2 | list.count(obj) | 统计某个元素在列表中出现的次数。 | obj – 列表中统计的对象。 | 返回元素在列表中出现的次数 |
3 | list.extend(seq) | 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) | seq – 元素列表,可以是列表、元组、集合、字典,若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾 | 该方法没有返回值,但会在已存在的列表中添加新的列表内容。 |
4 | list.index(x[, start[, end]]) | 从列表中找出某个值第一个匹配项的索引位置 | x-- 查找的对象。start-- 可选,查找的起始位置。end-- 可选,查找的结束位置。 | 该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。 |
5 | list.insert(index, obj) | 将对象插入列表 | index – 对象obj需要插入的索引位置。obj – 要插入列表中的对象。 | 该方法没有返回值,但会在列表指定位置插入对象。 |
6 | list.pop([index]) | 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 | index – 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。 | 该方法返回从列表中移除的元素对象。 |
7 | list.remove(obj) | 移除列表中某个值的第一个匹配项 | obj – 列表中要移除的对象。 | 该方法没有返回值但是会移除列表中的某个值的第一个匹配项。 |
8 | list.reverse() | 反向列表中元素 | 无 | 该方法没有返回值,但是会对列表的元素进行反向排序。 |
9 | list.sort( key=None, reverse=False) | 对原列表进行排序 | key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。 | 该方法没有返回值,但是会对列表的对象进行排序。 |
10 | list.copy() | 清空列表 | 无 | 返回复制后的新列表。 |
11 | list.clear() | 复制列表,浅拷贝 | 无 | 无返回值,但该列表清空。 |