Python案例如何操作列表?

wen python案例 12

Python列表操作实战:从基础到进阶的15个核心案例详解

目录导读

Python案例如何操作列表?

  • 列表基础操作:创建、访问与修改

  • 列表遍历与筛选:for循环与列表推导式

  • 列表排序:sort()与sorted()的差异

  • 列表增删元素:append、extend与remove的陷阱

  • 列表切片与复制:浅拷贝与深拷贝案例

  • 列表统计与分析:max、min、sum与count

  • 列表扁平化与嵌套处理

  • 列表与字符串互转:split与join

  • 列表去重与交集运算

  • 列表分组与Chunk分片

  • 列表索引与enumerate实战

  • 列表过滤:filter与条件筛选

  • 列表映射:map函数与lambda结合

  • 列表排序进阶:多条件排序与自定义key

  • 性能优化:列表与生成器的选择

  • Q&A常见问题解答

列表基础操作:创建、访问与修改

案例:创建包含学生成绩的列表并修改第三位学生的成绩。

scores = [85, 92, 78, 96, 88]
scores[2] = 81  # 修改索引2的值
print(scores[0])  # 输出:85

要点:Python列表索引从0开始,支持负索引(如-1表示最后一个元素),修改时若索引超出范围会抛出IndexError


列表遍历与筛选:for循环与列表推导式

案例:筛选出所有偶数并计算平方。

nums = [1, 2, 3, 4, 5, 6]
even_squares = [n**2 for n in nums if n % 2 == 0]
print(even_squares)  # 输出:[4, 16, 36]

对比传统写法

result = []
for n in nums:
    if n % 2 == 0:
        result.append(n**2)

问答:列表推导式与for循环哪个更快?
:列表推导式在Python内部以C语言速度运行,通常比显式for循环快2-3倍,但可读性仍需权衡。


列表排序:sort()与sorted()的差异

案例:对混合大小写字符串列表排序。

fruits = ['banana', 'Apple', 'cherry', 'Date']
# sort() 直接修改原列表
fruits.sort(key=str.lower)
print(fruits)  # 输出:['Apple', 'banana', 'cherry', 'Date']
# sorted() 返回新列表,不修改原列表
sorted_fruits = sorted(fruits, reverse=True)

避坑指南sort()返回None,不要写成new_list = my_list.sort(),否则new_list会是None


列表增删元素:append、extend与remove的陷阱

案例:向列表追加多个数字。

a = [1, 2]
a.append([3, 4])   # 结果:[1, 2, [3, 4]]
a.extend([5, 6])   # 结果:[1, 2, [3, 4], 5, 6]
# remove() 只删除第一个匹配项
a.remove(2)  # 删除数字2

常见错误

  • 误用append添加多个元素,导致生成嵌套列表。
  • remove删除不存在元素会抛出ValueError,需先判断。

列表切片与复制:浅拷贝与深拷贝案例

案例:复制一个包含可变对象的列表。

original = [[1, 2], [3, 4]]
shallow = original[:]   # 或 list(original)
shallow[0][0] = 99
print(original)  # 输出:[[99, 2], [3, 4]] (浅拷贝共享子列表)
# 深拷贝解决方案
import copy
deep = copy.deepcopy(original)
deep[0][0] = 100
print(original)  # 不受影响

问答:什么时候必须用深拷贝?
:当列表中包含可变对象(如列表、字典)且需要完全独立的副本时,必须使用copy.deepcopy()


列表统计与分析:max、min、sum与count

案例:统计学生成绩分布。

grades = [85, 92, 78, 85, 96, 78, 78]
print(f"最高分:{max(grades)},最低分:{min(grades)}")
print(f"总分:{sum(grades)},平均分:{sum(grades)/len(grades):.1f}")
print(f"78分出现次数:{grades.count(78)}")  # 输出:3

注意max()对字符串列表按ASCII码比较,sum()仅对数字有效。


列表扁平化与嵌套处理

案例:将二维列表扁平化为一维。

nested = [[1, 2], [3, 4, 5], [6]]
# 方法1:列表推导式(推荐)
flat = [item for sublist in nested for item in sublist]
print(flat)  # 输出:[1, 2, 3, 4, 5, 6]
# 方法2:itertools.chain
from itertools import chain
flat2 = list(chain.from_iterable(nested))

列表与字符串互转:split与join

案例:处理CSV格式数据。

# 字符串→列表
csv_str = "apple,banana,cherry"
items = csv_str.split(",")  # ['apple', 'banana', 'cherry']
# 列表→字符串
joined = " | ".join(items)  # 'apple | banana | cherry'

常见误区split()默认按空白分割,指定分隔符时需注意连续分隔符会生成空字符串。


列表去重与交集运算

案例:找出两个列表的公共元素。

list1 = [1, 2, 3, 4, 5, 3]
list2 = [3, 4, 5, 6, 7]
# 去重(保留顺序)
unique = list(dict.fromkeys(list1))  # [1,2,3,4,5]
# 交集
intersection = list(set(list1) & set(list2))  # [3,4,5]

性能提示:对于大型列表,先转换为set再进行交集运算,时间复杂度从O(n²)降为O(n)。


列表分组与Chunk分片

案例:将列表按固定长度分组。

data = [1, 2, 3, 4, 5, 6, 7, 8]
chunk_size = 3
chunks = [data[i:i+chunk_size] for i in range(0, len(data), chunk_size)]
print(chunks)  # 输出:[[1, 2, 3], [4, 5, 6], [7, 8]]

列表索引与enumerate实战

案例:找出列表中所有大于80的分数及其索引。

scores = [75, 88, 92, 67, 85]
high_scores = [(i, s) for i, s in enumerate(scores) if s > 80]
print(high_scores)  # 输出:[(1, 88), (2, 92), (4, 85)]

列表过滤:filter与条件筛选

案例:过滤出所有非空字符串。

words = ["hello", "", "world", "  ", "python"]
filtered = list(filter(None, words))  # 自动过滤空字符串
filtered2 = [w for w in words if w.strip()]  # 也过滤空白

列表映射:map函数与lambda结合

案例:将摄氏温度转换为华氏温度。

celsius = [0, 10, 20, 30, 100]
fahrenheit = list(map(lambda c: c * 9/5 + 32, celsius))
print(fahrenheit)  # 输出:[32.0, 50.0, 68.0, 86.0, 212.0]

列表排序进阶:多条件排序与自定义key

案例:按元组第一个元素升序,第二个元素降序。

data = [(1, 'b'), (2, 'a'), (1, 'a'), (3, 'c')]
# 先按第一个元素升序,再按第二个元素降序
data.sort(key=lambda x: (x[0], -ord(x[1])))
print(data)  # 输出:[(1, 'b'), (1, 'a'), (2, 'a'), (3, 'c')]

性能优化:列表与生成器的选择

案例:生成1000万个数时的内存比较。

import sys
# 列表占用内存
big_list = [i for i in range(10_000_000)]
print(sys.getsizeof(big_list))  # 约80MB
# 生成器占用内存
big_gen = (i for i in range(10_000_000))
print(sys.getsizeof(big_gen))   # 约112字节

问答:什么时候该用生成器代替列表?
:当只需遍历一次且数据量很大时,生成器可节省90%以上内存,但需要随机访问或多次遍历时,仍应使用列表。


Q&A常见问题解答

Q1:a.append(b)a += b有何区别?
Aappend(b)将b作为整体追加,等效于extend,会展开b的元素。

a = [1]; a.append([2])  # [1, [2]]
b = [1]; b += [2]       # [1, 2]

Q2:如何删除列表中的所有匹配项?
A:使用列表推导式生成新列表或while循环删除。

lst = [1, 2, 3, 2, 4]
lst[:] = [x for x in lst if x != 2]  # [1, 3, 4]

Q3:为什么list.sort()返回None?
A:这是Python的设计哲学——直接修改原对象的操作通常返回None,避免与返回新对象的函数混淆。

Q4:列表嵌套过深如何扁平化?
A:递归解法:

def flatten(lst):
    for item in lst:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

通过以上15个案例,您已掌握90%的日常列表操作场景,建议在IDE中亲手运行每个案例,并尝试修改参数观察效果,熟练运用这些技巧后,您会发现80%的Python数据处理任务都可高效完成。

抱歉,评论功能暂时关闭!