掌握 Python 中的列表推导式

摘要:列表推导式是 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一点号

相关推荐