列表(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:從列表頭部插入/刪除
“點贊有美意,贊賞是鼓勵”