列表(list)作为 Python 最常用的数据结构之一,不仅能存储有序数据,还能在推导式、函数参数传递、数据处理等场景中发挥强大作用。
下面介绍一些进阶技巧与常见应用。
一、去重与排序
1、快速去重(不保序)
nums = [1, 2, 2, 3, 4, 4, 5]unique = list(set(nums))print(unique) # [1, 2, 3, 4, 5](顺序不保证)
2、去重并保序
nums = [1, 2, 2, 3, 4, 4, 5]unique_stable = list(dict.fromkeys(nums))print(unique_stable) # [1, 2, 3, 4, 5]
3、自定义排序
words = ["banana", "apple", "cherry"]words.sort(key=len) # 按长度排序print(words) # ['apple', 'banana', 'cherry']
二、列表与函数参数
列表可灵活地与 *args、**kwargs 结合,支持参数解包与动态传参。
1、作为可变参数传递
def add(x, y, z): return x + y + z
args = [1, 2, 3]print(add(*args)) # 6,列表拆包传参
2、收集不定长参数
def avg(*args): return sum(args) / len(args)
print(avg(1, 2, 3, 4)) # 2.5,此处 args 是一个元组
3、同时接收必填和不定长参数
def report(title, *items): print(f"{title}: {items}")
report("Scores", 80, 90, 85)# Scores: (80, 90, 85)
三、列表切片的进阶用法
1、步长切片
nums = list(range(10))print(nums[::2]) # [0, 2, 4, 6, 8],隔一个取一个
2、反转列表
nums = [1, 2, 3, 4, 5]print(nums[::-1]) # [5, 4, 3, 2, 1]
3、原地替换片段
lst = [1, 2, 3, 4, 5]lst[1:4] = [20, 30]print(lst) # [1, 20, 30, 5]
四、与内置函数搭配
1、map() + list():批量转换
words = ["a", "bb", "ccc"]lengths = list(map(len, words))print(lengths) # [1, 2, 3]
2、filter() + list():条件筛选
nums = [1, 2, 3, 4, 5, 6]evens = list(filter(lambda x: x % 2 == 0, nums))print(evens) # [2, 4, 6]
3、zip() + list():配对合并
names = ["Alice", "Bob", "Cathy"]scores = [85, 90, 78]pairs = list(zip(names, scores))print(pairs) # [('Alice', 85), ('Bob', 90), ('Cathy', 78)]
五、列表推平(flatten)
1、嵌套推导式展开二维列表
matrix = [[1, 2, 3], [4, 5, 6]]flat = [x for row in matrix for x in row]print(flat) # [1, 2, 3, 4, 5, 6]
2、使用 itertools.chain
import itertools
matrix = [[1, 2, 3], [4, 5, 6]]flat = list(itertools.chain.from_iterable(matrix))print(flat) # [1, 2, 3, 4, 5, 6]
对于大数据量的嵌套列表,itertools.chain 更高效。
六、列表的性能优化技巧
1、列表 vs 集合查找
列表查找复杂度 O(n),集合平均 O(1),在需要频繁查找时应考虑集合:
data = list(range(100000))print(99999 in data) # O(n),效率低
data_set = set(data)print(99999 in data_set) # O(1),效率高
2、避免 += 拼接列表
lst = []for i in range(1000): lst += [i] # ❌ 效率低
lst = []for i in range(1000): lst.append(i) # ✅ 效率高
3、推导式替代循环
列表推导式在多数场景下更简洁高效:
lst = [i for i in range(1000)] # 更简洁高效
七、deque:高效双端队列
在需要频繁从列表头部插入/删除时,collections.deque 更高效。
from collections import deque
dq = deque([1, 2, 3])dq.appendleft(0) # 左端添加dq.append(4) # 右端添加print(dq) # deque([0, 1, 2, 3, 4])
dq.popleft() # 左端删除print(dq) # deque([1, 2, 3, 4])
deque 在双端操作时复杂度为 O(1),比 list.insert(0, x) 更优。
📘 小结
去重与排序:set() 去重、dict.fromkeys() 保序、自定义排序
函数参数:支持拆包、收集不定长参数
切片技巧:步长、反转、原地替换
函数式搭配:结合 map、filter、zip
推平技巧:嵌套推导式、itertools.chain
性能优化:选对数据结构,避免低效操作
deque:从列表头部插入/删除
“点赞有美意,赞赏是鼓励”