Python-数据类型:列表
0 前言
1 列表的重要特新
- 列表是可变数据,列表的方法/切片会直接修改列表的数据对象,无需另外赋值
x = [1]
x.append(2)
# x=[1, 2],修改了x的数据对象
=
两端的列表指向同一个数据对象,并没有新建数据
x = [1]
y = x
print(x is y) # True,是同一个数据对象,不单单是值相同
x.append(2)
print(y) # y=[1, 2] # 方法和切片是修改
- 列表的算数运算会新建数据对象
x = [1]
y = x
x = x + [2]
print(y) # y=[1]
1.1 创建列表
x1 = [] # 空列表
x2 = list() # 空列表
x3 = [10, 20, 'abc', True]
x4 = list('abcde') # x4=['a', 'b', 'c', 'd']
x5 = list(range(10)) # x5=[0,1,2,3,4,5,6,7,8,9]
x6 = [range(10)] # x6=[0,1,2,3,4,5,6,7,8,9]
x7 = [1] * 3 # [1, 1, 1] 重复元素的n维列表
1.2 列表与其他数据类型转化
字符串转化为列表
x = list('ab cde') # x=['a', 'b', ' ', 'c', 'd', 'e']
x = ('ab cde').split() # x=['ab', 'cde']
列表转化为字符串
x = ['a', 'b', ' ', 'c', 'd', 'e']
s = ''.join(x)
# s = 'ab cde'
迭代器转化为列表
x = list(range(10))
x = [range(10)]
# x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1.3 列表解包
接受解包的变量数必须和列表元素数量相同
x = [10, 20, 30]
a, b, c = x
print a, b, c # 10, 20 ,30
1.4 列表切片
x = [0, 1, 2, 3, 4]
x = x[1:4]
print(x) # x=[1, 2, 3]
1.5 列表加法
列表+
运算两端必须都是列表
x = [0]
x = x + [1]
print(x) # [0, 1]
2 列表的方法
列表是可变序列,体现为列表的方法会修改列表自身,不是必须使用=
赋值给新变量
如果使用=
赋值给新变量,本质是改变原列表后,又将改变后的原列表赋值给新变量
- 改变自身的方法
self=List类 | 说明 |
---|---|
self.append(elem) | 向列表末尾追加单个元素 |
self.extend(newlist) | 向列表末尾追加列表 |
self.clear() | 清空列表 |
self.insert(index, elem) | 在指定位置插入元素 |
self.remove(elem) | 删除第一次出现的元素 |
self.pop(index) self.pop() | 弹出指定下标的元素,缺省时弹出最后一个 |
self.reverse() | 列表的反转,改变原列表的先后顺序 |
self.sort(reverse=False) | 将列表中的元素进行排序 默认 False 按升序排列 |
- 不改变自身的方法
self=List类 | 说明 |
---|---|
self[start:end:step] -> listself[start:end:step] = list | 列表的切片的可以读取或赋值 列表的切片不改变自身 |
self.index(elem) -> indexself.index(elem) -> Exception | 返回元素在列表中第一次出现的下标 没有则报 ValueError |
self.count(elem) -> num | 返回元素在字符串中出现次数 |
len(self) -> num | 列表元素数量 |
max(self) -> num | 列表最大元素 |
min(self) -> num | 列表最小元素 |
sum(self) -> num | 列表元素和 |
2.1 增加列表元素操作 append extend insert
- append在末尾添加元素,对列表的修改直接反映在原数据上,没有返回值
x = [10, 20]
y = x.append('*') # 元素添加到x尾部
>>>x = [10, 20, '*']
>>>y = None
- extend在末尾添加另一个列表中的所有元素,对列表的修改直接反映在原数据上,没有返回值
x = [10, 20]
b = [30, 40]
x.extend(b) # x=[10, 20, 30, 40]
- insert在指定位置添加元素,对列表的修改直接反映在原数据上,没有返回值
x = [10, 20, 30]
x.insert(2, 25) # 在index=2处插入值25, x=[10, 20, 25, 30]
2.2 删除列表元素操作 remove pop clear
列表删除都是在原变量直接修改,不需要新变量接收结果
x = [10, 20, 30]
x.remove(20) # 删除x中首个元素20
print('x1 = ', x)
x = [10, 20, 30]
x.pop(1) #删除 index=1 处的元素,可用列表多选
print('x2 = ', x)
x.clear() #删除所有元素,变为空列表
print('x3 = ', x)
>>>x1 = [10, 30]
>>>x2 = [10, 30]
>>>x3 = []
2.3 列表元素访问 index count len
x = [10, 20 ,30]
y1 = x.index(20) #返回第一个元素20的index
y2 = x.count(20) #返回元素20的个数
y3 = len(x) #返回x的长度
y4 = max(x) #返回最大元素
y5 = min(x) #返回最小元素
y6 = sum(x) #返回元素和
2.4 列表排列 sort reverse [::-1]
升序/降序
x = [20, 10, 30, 40]
x.sort()
print('x1 = ', x)
x.sort(reverse=True)
print('x2 = ', x)
x = [20, 10, 30, 40]
x3 = x[::-1]
print('x3 = ', x3)
>>>x1 = [10, 20, 30, 40]
>>>x2 = [40, 30, 20, 10]
>>>x3 = [40, 30, 10, 20]
3 对单个表格元素进行快速操作
3.1 单个元素操作
对表格每个元素+1
a = [1, 2, 3]
b = [elem+1 for elem in a]
print(b)
结果:
b = [2, 3, 4]
使用map()
函数和匿名函数
a = [1, 2, 3]
b = map(lambda x:x+1, a)
print(b)
结果:
b = [2, 3, 4]
使用map()
函数和复杂函数
def add(x):
retrun x+1
a = [1, 2, 3]
b = map(add, a)
print(b)
结果:
b = [2, 3, 4]
3.2 相邻元素操作
计算相邻元素差分,[0]位不变
a = [1, 3, 5]
b = [a[0]] + [a[i+1]-a[i] for i in range(len(a)-1)
print(b)
结果:
b = [1, 2, 2]
3.3 元素累计操作
计算当前元素及之前所有元素和
a = [1, 3, 5]
b = [sum(a[:i+1]) for i in range(len(a))]
print(b)
结果:
b = [1, 4, 9]
4 对多个表格元素进行快速操作
4.1 两个表格对位相加
zip()
将两个表格的对应元素合并为元组
x = ['a', 'b', 'c']
y = ['1', '2', '3']
z = [elem[0]+elem[1] for elem in zip(x,y)]
print(z)
结果:
z = ['a1', 'b2', 'c3']
4.2 筛选在表格2中出现的表格1元素
x = ['a', 'b', 'c']
y = ['b', 'c', 'd']
z = [elem for elem in x if(elem in y)]
print(z)
结果:
z = ['b', 'c']
5 二维列表处理
对excel进行复杂处理时,先将表格转为二维列表,然后进行处理
5.1 对表格除表头外进行排序
a = [['数学', '语文'], [12, 34], [23, 56], [47, 12], [23, 90]]
a = a[0] + sorted(a[1:], key=lambda x:(x[1],x[0]))
print(a)
>>>['数学', '语文', [47, 12], [12, 34], [23, 56], [23, 90]]
5.2 表格按指定顺序排序
a = [['数学', '语文'], [12, 34], [23, 56], [47, 12], [23, 90], [72, 12]]
b = [56, 34, 90, 12]
c = a[0] + sorted(a[1:], key=lambda x:(b.index(x[1]), x[0]))
print(c)
>>>['数学', '语文', [23, 56], [12, 34], [23, 90], [47, 12], [72, 12]]
5.3 删除有空单元格的行
a=[['数学', '语文'], [12, 34], [23, ''], [47, 12], [23, 90]]
b = filter(lambda x: '' not in x, a)
print(list(b))
>>>[['数学', '语文'], [12, 34], [47, 12], [23, 90]]