摘要:列表推导式是 Python 中的一项强大功能,它允许在创建和转换列表时使用更清晰、更具可读性的代码。通过将多行代码压缩到单个表达式中,列表推导式使您的代码更加高效和简洁,尤其是在处理数据转换、筛选和映射时。
列表推导式是 Python 中的一项强大功能,它允许在创建和转换列表时使用更清晰、更具可读性的代码。通过将多行代码压缩到单个表达式中,列表推导式使您的代码更加高效和简洁,尤其是在处理数据转换、筛选和映射时。
列表推导式是一种创建新列表的简洁方法,它通过将表达式应用于现有列表或可迭代对象的每个元素,并可选择根据条件筛选元素。
语法:
new_list = [expression for item in iterable if condition]expression:应用于每个项目的操作或转换。item:表示 Iterable 中每个元素的变量。iterable:原始集合(如 List、Range 或 Generator)。condition:(可选)根据布尔条件筛选元素。下面是一个比较传统循环与列表推导式的简单示例:
列表推导之前:
numbers = for i in range(5): numbers.append(i * 2)列表推导式之后:
numbers = [i * 2 for i in range(5)]结果:[0, 2, 4, 6, 8]
示例:创建平方数列表
使用传统循环:
squares = for x in range(10): squares.append(x**2)使用列表推导式:
squares = [x**2 for x in range(10)]列表推导式可以提高可读性,并且通常对于简单的任务更有效。但是,对于复杂的 logic,传统 Loop 可能更可取。
由于 Python 的优化,列表推导式通常比传统循环更快。下面是一个使用 timeit 模块的基准测试:
import timeitsizes = [100, 1000, 10000, 100000]for size in sizes: loop_time = timeit.timeit(f'''squares = for x in range({size}): squares.append(x**2)''', number=100) comp_time = timeit.timeit(f'''squares = [x**2 for x in range({size})]''', number=100) print(f"Size: {size} - Loop: {loop_time:.6f}s, Comprehension: {comp_time:.6f}s")通常,列表推导式的性能优于传统循环,但差异可能会因复杂性和数据集大小而异。
对多维列表或组合元素使用嵌套推导式。
pairs = [(x, y) for x in range(3) for y in range(3)]在单个推导式中应用多个条件来筛选数据。
labels = ["even" if x % 2 == 0 else "odd" for x in range(10)]生成器表达式是一种节省内存的替代方案,因为它们逐个生成项目,而不是创建整个列表。
# Memory-efficient generator expressionsum(x * 2 for x in range(1000000))# Memory-intensive list comprehensionsum([x * 2 for x in range(1000000)])在处理大型数据集时使用生成器表达式以节省内存。
将摄氏度转换为华氏度:
from typing import Listdef process_temperatures(celsius: List[float]) -> List[float]: return [(temp * 9/5) + 32 for temp in celsius]使用 pathlib进行文件处理
from pathlib import Pathfile_sizes = [f.stat.st_size for f in Path('.').glob('*.py')]使用 defaultdict对数据进行分组
from collections import defaultdictnames = ['Alice', 'Bob', 'Anna', 'Bill']by_initial = defaultdict(list)[by_initial[name[0]].append(name) for name in names]避免对以下对象进行列表推导:
复杂逻辑:对复杂操作使用循环。Multiple Statements(多个语句):推导式只允许一个表达式。过度嵌套:深度嵌套的推导式会降低可读性。可变默认值:
# Correct[[0] * 3 for _ in range(3)]# Incorrect[[0] * 3] * 3 # Same list reference类型错误:
[int(x) for x in ['1', '2', 'a', '3']] # ValueError for 'a'常见错误和解决方案:
名称错误:确保在使用前定义变量。
[name.title for name in names] # NameError if `names` undefined除法误差:
def safe_division(numbers: List[float], divisors: List[float]) -> List[float]: return [n/d if d != 0 else float('inf') for n, d in zip(numbers, divisors)]使用 assert 语句进行验证:
# Testing accuracyoutput = [x**2 for x in range(5)]assert output == [0, 1, 4, 9, 16]使用 timeit 进行性能分析。
数据清洗
def clean_data(raw_data: List[str]) -> List[str]: return [entry.strip.lower for entry in raw_data if entry and not entry.isspace]URL 参数解析
def parse_url_params(urls: List[str]) -> List[Dict[str, str]]: return [ dict(param.split('=') for param in url.split('?')[1].split('&')) for url in urls if '?' in url ]来源:自由坦荡的湖泊AI一点号