列表是Python中最基本、最常用的序列数据结构;列表中元素不需要具有相同的类型。列表中的每个元素都对应一个位置索引(从0开始)。
基础
列表做为一种序列结构,可以索引,切片,加,乘,检查成员。
列表中:+ 号用于组合列表,* 号用于重复列表。
Python 表达式 | 结果 | 描述 |
---|---|---|
len([1, 2, 3]) | 3 | 长度 |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 组合 |
[‘Hi!’] * 4 | [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] | 重复 |
3 in [1, 2, 3] | True | 元素是否存在于列表中 |
创建
列表中元素的数据类型可以不同,可以是任意的基本类型或者是自定义类型。
#创建空列表
one = []
two = list()
#创建带有元素的列表
three = [1,3,5]
example = [1, True, "test", 2.3]
以下使用example
为例说明。
切片
切片是为了获得序列某个区间的元素序列,适用于列表、元组、字符串、range对象等。可以用切片截取列表中任何部分来获得一个新的列表,也可以进行元素的增、删、改。
切片操作通过使用两个冒号分隔3个数字来实现[start:end:step]
,对应位置为空时,使用默认值:
- 第一个数字表示切片的开始位置,当省略时:
- step>0时,默认值为0;
- step<0时,默认值为
length-1
(列表长度-1);
- 第二个数字表示切片的终止位置(但不包含该位置的元素),当省略时:
- step>0时,默认值为
length
(列表长度); - step<0时,默认值为-1(即首元素前一个位置);
- step>0时,默认值为
- 第三个数字为切片的步长,默认为1;
- start与end若小于0(设为value),则实际值为
(length+value)
;
范围
切片超出列表范围时,不会报错:
- 尝试获取超出列表范围的切片,返回一个空列表;
- 切片中索引项的起始值大于结束值,返回一个空列表;
# 复制列表
other = example[:]
# index开始的所有项
last = example[index:]
# index前所有项(不包括index自身)
front = example[:index]
步长
步长用于跳过不需要的项,默认为1(即获取全部):
- step > 0,从 start 位置往后,每 step 取一个值;
- step < 0,从 start 位置往前,每 step 取一个值
# 逆序
reverse = example[::-1]
# 前三个逆序
front3 = example[2::-1] # 第二个(即end)一定要空
front3 = example[2:0:-1] # 获取第二个与第三个,并逆序
访问
可通过下表获取与设定列表中的值。
取值
获取列表中的元素:
- 单个值:
lst[index]
; - 范围:
lst[startIndex, endIndex]
,返回[start,end)
范围值作为子列表;
允许索引为负数(表示从右向左数,最右边的为-1),可想象成实际索引为:len(lst)+index
(index<0)。
索引值越界时会抛出IndexError: list index out of range
的异常。
print(example[1])
example[1] = 'False'
遍历
通过for...in
可方便地遍历列表中元素:
for ele in example:
print(ele)
通过列表解析的方式:
[print(ele) for ele in example]
通过enumerate遍历(获取索引与元素):
for index, ele in enumerate(example):
print(index, ele)
更新
更新列表中已有的值,可直接通过下标赋值即可:
example[1] = "False" # 可同时改变元素类型
添加新的元素:
- 尾部追加:
- append:把参数作为整体(一个元素)追加到尾部;
- extend:对于列表或者元祖依次把每个元素追加到尾部;
- 中间某个位置插入元素:
lst.insert(index, ele)
example.append(('add1', 'add2')) # 列表尾部添加一个元素(元祖)
example.extend(('add1', 'add2')) # 列表尾部添加两个元素(add1和add2)
example.insert(1, ('add1', 'add2')) # 在索引1处添加一个元素,元素[1:]依次后移
删除
删除列表中的元素:
- 根据索引:
- del单个:
del example[index]
; - del范围:
del example[start, end]
,删除[start, end)
范围内元素; - pop成员函数(缺省移除最后一个元素):
ele = example.pop(index)
;
- del单个:
- 根据值:
example.remove(ele)
,删除第一个和指定值相同的元素,若元素不存在会引发ValueError
错误; - 清空:
example.clear()
列表函数
有以下列表函数:
序号 | 函数 |
---|---|
1 | cmp(list1, list2) 比较两个列表的元素 |
2 | len(list) 列表元素个数 |
3 | max(list) 返回列表元素最大值 |
4 | min(list) 返回列表元素最小值 |
5 | list(seq) 将元组转换为列表 |
列表比较
cmp比较两个列表时,如果两个元素不是同一种类型,则检查它们是否是数字。
- 如果是数字,执行必要的数字强制类型转换,然后比较。
- 如果有一方的元素是数字,则另一方的元素"大"(数字是"最小的")
- 否则,通过类型名字的字母顺序进行比较。
如果有一个列表首先到达末尾,则另一个长一点的列表"大"。有元素都是相等的,那么返回0。
列表方法
列表有如下方法
序号 | 方法 |
---|---|
1 | list.append(obj) 在列表末尾添加新的对象 |
2 | list.count(obj) 统计某个元素在列表中出现的次数 |
3 | list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
4 | list.index(obj) 从列表中找出某个值第一个匹配项的索引位置 |
5 | list.insert(index, obj) 将对象插入列表 |
6 | list.pop(index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
7 | list.remove(obj) 移除列表中某个值的第一个匹配项 |
8 | list.reverse() 反向列表中元素 |
9 | list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序 |