PYTHON 数据结构 - 列表
1.1 列表
列表类似元组:
- 可以存放多个元素(可不同类型)
- 有顺序
- 可重复
列表是可变的,可添加,删除,排序元素
1.2 列表的创建
# 列表 =[元素1,元素2, ...]
a = [1,2,3,4]
a = [] # 空列表
# 用list创建,list(序列)
>>> a = list("hello")
>>> a
['h', 'e', 'l', 'l', 'o']
>>> a = list() # 空列表
>>> a
[]
1.3 列表的访问与切片
同字符串,元组。参考之前的笔记
>>> a = [1,2,3,4,5]
>>> a[1]
2
>>> a[1:3]
[2, 3]
1.4 列表的修改
1.4.1 追加元素
# 用追加单个元素
>>> a = [1,2,3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
# 追加一个列表(依次导入元素) 相当于列表相加
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
# 列表相加
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = a + b # 两个列表的元素合并到一个新列表
>>> c
[1, 2, 3, 4, 5, 6]
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a += b #类似extend
>>> a
[1, 2, 3, 4, 5, 6]
1.4.2 插入元素
# list.insert(索引, 元素值)
>>> a = [1,2,3]
>>> a.insert(1,1.5)
>>> a
[1, 1.5, 2, 3]
1.4.3 替换元素
>>> a = [1,2,3]
>>> a[0] = "first"
>>> a
['first', 2, 3]
1.4.4 删除元素
# remove(item)方法
>>> a = [1,"next",1,2,3]
>>> a.remove(1) # 从左开始,只删除一次, 没有抛出异常
>>> a
['next', 1, 2, 3]
# pop(index)方法
# 按索引删除,如果index省略,删除最后一个
>>> a = [1,2,3]
>>> a.pop(0) ## 删除第一个
1
>>> a
[2, 3]
>>> a.pop() ## 删除最后一个
3
>>> a
[2]
# del 删除
>>> a = [1,2,3]
>>> del a[0]
>>> a
[2, 3]
# 删除一片区域
>>> a = [1,2,3,4,5,6]
>>> del a[0:3]
>>> a
[4, 5, 6]
1.5 列表的其它方法
-
列表元素翻转
>>> a = [1,2,3,4,5] >>> a.reverse() >>> a [5, 4, 3, 2, 1] -
列表复制
>>> a = [1,2,3] >>> b = a.copy() >>> b [1, 2, 3] -
列表清空
>>> a = [1,2,3] >>> a.clear() >>> a [] -
列表元素查找
>>> a = [1,2,3,4] >>> a.index(3) # 未找到报异常 2 >>> a = [1,2,3,4,1,2,3,4] >>> a.index(3,3) # index(元素,开始位置 ,结束位置) 6 -
统计出现的次数
>>> a = [1,2,3,4,1,2,3,4] >>> a.count(2) 2 -
其它运算
* 用于重复列表,in, not in 与序列一致。
1.6 列表的排序
1.6.1 列表的sort方法排序
列表排序用sort方法实现。
sort(key=None, reverse=False)
key指定排序的函数,reverse表示降序,默认是升序
# 能排序的自动排序
a = [1,3,56,4,2,0]
a.sort()
print(a)
对于一些自定义对象无法排序,sort会报错,可以指定一个函数告诉排序的方法
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def __str__(self):
return "{}\t{}".format(self.name, self.score)
studs = [Student('张三', 100), Student('李四', 120), Student('王五', 98), Student('吴用', 70)]
def sort_score(stud:Student):
return stud.score
studs.sort(key = sort_score)
for student in studs:
print(student)
python内部sort排序是通过比较运算 "<"来确定排序对象的先后顺序,可以重载 "<" 实现排序。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def __lt__(self, other): # 重载 <
return self.score - other.score
def __str__(self):
return "{}\t{}".format(self.name, self.score)
studs = [Student('张三', 100), Student('李四', 120), Student('王五', 98), Student('吴用', 70)]
studs.sort()
for student in studs:
print(student)
1.6.2 系统内置函数sorted函数排序
list.sort会修改列表的顺序,而sorted不修改原列表的顺序,会生成一个新的列表。
sorted(iterable, key=None, reverse=False)
iterable是一个列表,key后面跟上排序函数,reverse为True表示降序
>>> sorted(a)
[0, 1, 2, 3, 4, 5]
>>> sorted(a, reverse=True)
[5, 4, 3, 2, 1, 0]
指定一个字段的排序函数:
class Student:
def __init__(self, name, gender,score):
self.name = name
self.gender = gender
self.score = score
def __str__(self):
return "{}\t{}\t{}".format(self.name, self.gender, self.score)
studs = [
Student('张三', '男', 100),
Student('李四', '男', 120),
Student('王红', '女', 98),
Student('吴用', '女', 170)
]
new_list = sorted(studs, key=lambda student: student.score)
for student in new_list:
print(student)
指定多个字段的排序函数:
对于((1,2,3),(1,2,4)) 排序的时候先按第一列,第一列相同按第二列,第二列相同按第三列排序,如果函数能返回一个元组(可排序的值),就可以按多字段排序了。
# 先按性别,再按成员
class Student:
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
def __str__(self):
return "{}\t{}\t{}".format(self.name, self.gender, self.score)
studs = [
Student('张三', '男', 100),
Student('李四', '男', 120),
Student('王红', '女', 98),
Student('吴用', '女', 170)
]
new_list = sorted(studs, key=lambda student: (student.gender, -student.score))
for student in new_list:
print(student)
用cmp函数排序
思想:compare(x,y)函数, 会在x<y时返回负数,在x>y时返回正数,如果x=y则返回 0
可以用于多条件排序,只需要定义函数,返回值是正数,负数和0就可以了。
# 用cmp排序
from functools import cmp_to_key
a = [1, 3, 2, 100, 80, 7, 5]
def cmp(n1: int, n2: int) -> int:
return n1 - n2
new_list = sorted(a, key=cmp_to_key(cmp))
print(new_list)
1.7 列表推导式
可以通过两种方式:
- [item for item in iterable]
- [item for item in iterable if condition]
>>> a = [i for i in range(10)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a = [i for i in range(10) if i%2==0]
>>> a
[0, 2, 4, 6, 8]

浙公网安备 33010602011771号