列表 list
列表是由一系列特定元素组成的,元素和元系之间没有任何关联关系,但他们之间有先后顺序关系
- 列表是一种容器
- 列表是序列的一种
- 列表是可以被改变的序列
列表的创建
-
创建空列表的字面值
L = [] # L绑定空列表
-
创建非空列表
L = [1, 2, 3, 4] L = ["北京", "上海", "重庆"] L = [1, 'two', 3, '四'] L = [1, 2, [3.1, 3.2, 3.3], 4]
列表的构造(创建)函数 list
list()
生成一个空的列表,等同于[]
-
list(iterable)
用可迭代对象创建一个列表L = list() # L 为空列表,等同于 L = [] L = list("ABCD") # L = ['A','B','C','D'] L = list(range(1, 10, 2)) # L = [1,3,5,7,9]
列表的运算
算术运算
+
用于拼接列表+=
用于原列表与左侧可迭代对象进行拼接,生成新的列*
生成重复的列表-
*=
用于生成重复的列表,同时用变量绑定新列表x = [1,2,3] y = [4,5,6] z = x + y # z = [1,2,3,4,5,6] x = [1,2,3] x += [4,5,6] # x = [1,2,3,4,5,6] x = [1,2,3] x += 'ABC' # += 右侧必须是可迭代对象 x = [1,2,3] * 2 # x = [1,2,3,1,2,3] x = [1, 2] x *= 3 # x = [1,2,1,2,1,2]
比较运算
小于
<
大于
>
等于
==
小于等于
<=
大于等于
>=
-
不等于
!=
x = [1,2,3] y = [2,3,4] x != y # True x > [1,2] # True x < y # True [1,3,2] > [1,2,3] # True ['AB', 'CD'] > ['AC', 'BD'] # False [1, 'two'] > ['two', 1] # TypeError
列表的 in/not in
判断一个数据元素是否存在于容器(列表)内,如果存在返回
True
, 否则返回False
-
not in
的返回值与in
运算符相反x = [1, 'Two', 3.14, '四'] 1 in x # True 2 in x # False 3 not in x # True '四' not in x # False
列表的索引 index
列表的索引语句
列表[整数表达式]
用法
列表的索引取值与字符串的索引取值规则完全相同
-
列表的索引为分正向索引和反向索引
L = ['A', 2, 'B', 3] print(L[1]) # 2 x = L[2] # x = 'B'
列表的索引赋值
列表是可变的序列,可以通过索引赋值改变列表中的元素
语法
列表[索引] = 表达式
x = [1,2,3,4]
x[2] = 3.14 # 改变了第三个元素的值
列表的切片 slice
列表[:]
列表[::]
-
列表的切片取值返回一个列表,规则等同于字符串的切片规则
x = list(range(9)) y = x[1:9:2] # y = [1,3,5,7]
列表的切片赋值
列表[切片] = 可迭代对象
说明
切片赋值的赋值运算符的右侧必须是一个可迭代对象
L = [2,3,4]
L[0:1] = [1.1, 2.2]
print(L) # [1.1, 2.2, 3, 4]
L = [2,3,4]
L[:] = [7,8] # [7,8]
L = [2,3,4]
L[1:2] = [3.1, 3.2, 3.3] # [2,3.1, 3.2, 3.3,4]
L = [2,3,4]
L[1:1] = [2.1, 2.2] # [2, 2.1, 2.2, 3, 4]
L = [2,3,4]
L[0:0] = [0, 1] # L=[0, 1, 2,3,4]
L = [2,3,4]
L[3:3] = [5,6] # [2,3,4, 5,6]
L = [2,3,4]
L[1:2] = [] # [2,4]
注意点
对于步长不等于1的切片赋值,赋值运算符的右侧的可迭代对象提供元素的个数一定要等于切片切出的段数
L = [1,2,3,4,5,6]
L[::2] = 'ABCD' # 错的
L[::2] = 'ABC' # 对的
del
语句用于删除列表元素
del 列表[索引]
-
del 列表[切片]
L = [1,2,3,4,5,6] del L[0] # L = [2,3,4,5,6] del L[-1] # L = [2,3,4,5] L = [1,2,3,4,5,6] del L[::2] # L = [2, 4, 6]
Python3中常用的列表方法
Python3中常用的序列函数:
len(seq)
返回序列的长度max(x)
返回序列的最大值元素min(x)
返回序列的最小值元素sum(x)
返回序列中所有元素的和(元素必须是数值类型)any(x)
真值测试, 如果列表中其中一个值为真值则返回True,否则返回False-
all(x)
真值测试,如果列表中所有值为真值,则返回True,只要有一个为假,则返回Falses = "ABCD" print(len(s)) # 4 print(max(s)) # D print(min(s)) # A lst1 = [1,2,3] lst2 = [0,1,2] print(sum(lst1)) # 6 print(any(lst1)) # True print(all(lst1)) # True print(sum(lst2)) # 3 print(any(lst2)) # True print(all(lst2)) # False
列表总结
创建列表
用中括号
[]
包裹元素,元素使用逗号分隔用
list()
方法,转化生成列表-
列表生成式/列表解析式/列表推导式,生成列表
list_a = [1, 2, 3] list_b = list("abc") # list_b == ['a', 'b', 'c'] list_c = list((4, 5, 6)) # list_c == [4, 5, 6] list_d = [i for i in list_a] # list_d == [1, 2, 3] list_e = [i*j for i in list_a for j in list_c] # list_e == [4,5,6,10,12,12,15,18] list_f = [i*j for i,j in zip(list_a,list_c)] # list_f == [4, 10, 18] list_g = [i for i in list_a if i%2 == 0] # list_g == [2] # 结合range()函数,range(start, stop[, step]) list_h = list(range(3)) # list_h == [0, 1, 2] list_i = list(range(3,7)) # list_i == [3, 4, 5, 6] list_j = list(range(3,9,2)) # list_j == [3, 5, 7] # 找出100以内的能够被3整除的正整数 list_k = list(range(3,100,3)) # list_k == [3, 6, 9, ..., 96, 99]
扩充列表
用
append()
方法,在列表尾部添加单个新元素。用
insert()
方法,在列表中指定位置添加元素。用
+
运算符,将两个列表拼接出一个新列表。-
用
extend()
方法,在一个列表后面拼接进另一个列表# 以下分别添加2个元素 list_a = [] list_a.append('happy') # list_a == ['happy'] list_a.insert(0, 'very') # list_a == ['very', 'happy'] # 以下两种扩充列表方式 list_1 = ['I', 'am'] list_2 = ['very', 'happy'] list_3 = list_1 + list_2 # 新列表 list_3 == ['I', 'am', 'very', 'happy'] list_1.extend(list_2) # 原列表1扩充,list_1 == ['I', 'am', 'very', 'happy']
删减列表与销毁列表
用
del list[m]
语句,删除指定索引m
处的元素。用
remove()
方法,删除指定值的元素(第一个匹配项)。用
pop()
方法,取出并删除列表末尾的单个元素。用
pop(m)
方法,取出并删除索引值为m的元素。用
clear()
方法,清空列表的元素。(杯子还在,水倒空了)-
用
del list
语句,销毁整个列表。(杯子和水都没有了)# 以下4种删除列表元素方式 list_1 = list_2 = list_3 = list_4 = ['I', 'am', 'very', 'happy'] del list_1[0] # list_1 == ['am', 'very', 'happy'] list_2.remove('I') # list_2 == ['am', 'very', 'happy'] list_3.pop() # list_3 == ['I', 'am', 'very'] list_4.pop(0) # list_4 == ['am', 'very', 'happy'] # 清空与销毁 list_a = [1, 2, 3] list_b = [1, 2, 3] list_b.clear() # list_b == [] del list_a # 没有list_a了,再使用则会报错
列表切片
基本含义
从第 i
位索引起,向右取到后 n
位元素为止,按 m
间隔过滤
基本格式
[i : i+n : m]
:
i
是切片的起始索引值,为列表首位时可省略;i+n
是切片的结束位置,为列表末位时可省略;m
可以不提供,默认值是1,不允许为0,当m为负数时,列表翻转。-
注意:这些值都可以大于列表长度,不会报越界。
li = [1, 4, 5, 6, 7, 9, 11, 14, 16] # 以下写法都可以表示整个列表 X = len(li) li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:] li[1:5] == [4,5,6,7] # 从1起,取5-1位元素 li[1:5:2] == [4,6] # 从1起,取5-1位元素,按2间隔过滤 li[-1:] == [16] # 取倒数第一个元素 li[-4:-2] == [9, 11] # 从倒数第四起,取-2-(-4)=2位元素 li[:-2] == li[-len(li):-2] == [1,4,5,6,7,9,11] # 从头开始,取-2-(-len(li))=7位元素 # 注意列表先翻转,再截取 li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻转整个列表 li[::-2] == [16,11,7,5,1] # 翻转整个列表,再按2间隔过滤 li[:-5:-1] == [16,14,11,9] # 翻转整个列表,取-5-(-len(li))=4位元素 li[:-5:-3] == [16,9] # 翻转整个列表,取-5-(-len(li))=4位元素,再按3间隔过滤 li[::0] # 报错(ValueError: slice step cannot be zero)
列表生成式
列表生成式即列表推导式或列表解析式
-
列表生成式有一个致命的缺点:它一次性把所有元素加载到内存中,当列表过长的时候,便会占据过多的内存资源,而且,我们通常仅需要使用少数的元素,这样未使用的元素所占据的绝大部分的内存,就成了不必要的支出
l = [x*2 for x in range(5)] # 列表生成式,4以内整数的2倍数
其它操作
用
len()
方法,统计全部元素的个数。用
count()
方法,统计指定值的元素的个数。用
max()
方法,统计元素中的最大值(要求元素类型相同;数字类型直接比较,其它类型比较id
)用
min()
方法,统计元素中的最小值(要求元素类型相同;数字类型直接比较,其它类型比较id
)用
index()
方法,查找指定值的元素的索引位置(第一个匹配项)。用
reverse()
方法,翻转列表中的元素。用
copy()
方法,浅拷贝并生成新的列表。用
deepcopy()
方法,深拷贝并生成新的列表。用
sort()
方法,在原列表基础上进行排序。-
用
sorted()
方法,将新列表基础上对原列表的元素进行排序。list_1 = [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)] len(list_1) == 5 list_1.count(10) == 1 # 元素10的数量为1 list_1.index(10) == 1 # 元素10的索引为1 list_1.reverse() # list_1 == [(33, 44), ['hi', 1, 2], '2018-10-1', 10, 2018] # 比较浅拷贝与深拷贝 import copy list_a = [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)] list_b = ['hi', 1, 2] list_c = list_a.copy() # list_c == [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)] list_d = copy.deepcopy(list_a) # list_d == [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)] # 改变原列表中的可变对象元素 list_a[3].append('new') # list_a == [2018, 10, '2018-10-1', ['hi', 1, 2, 'new'], (33, 44)] # 浅拷贝中的可变对象会随原列表变化而变化 list_c == [2018, 10, '2018-10-1', ['hi', 1, 2, 'new'], (33, 44)] # 深拷贝中的可变对象不会随原列表变化而变化 list_d == [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)] # 比较sort() 与 sorted() list_1 = list_2 = [2,1,4,6,5,3] list_1.sort() # 原列表变化:list_1 == [1,2,3,4,5,6] list_3 = sorted(list_2) # 原列表不变:list_2 == [2,1,4,6,5,3]; list_3 == [1,2,3,4,5,6]