Python推导式(comprehensions)是一种简洁且高效地从可迭代对象创建新列表、集合、字典或元组的方法。它们提供了一种优雅的方式来表达循环和条件逻辑,同时避免了冗长的循环代码。

Python推导式主要分为列表推导式(list comprehensions)、集合推导式(set comprehensions)、字典推导式(dict comprehensions)以及元组推导式(虽然元组推导式不常见,因为元组是不可变的,但可以通过生成器表达式配合tuple()函数来实现)。

列表推导式

列表推导式允许你从现有的列表或其他可迭代对象创建一个新的列表。

列表推导式格式为:

[表达式 for 变量 in 列表] 
[out_exp_res for out_exp in input_list]

或者 

[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]

说明:

  • out_exp_res:列表生成元素表达式,可以是有返回值的函数。
  • for out_exp in input_list:迭代input_list将out_exp传入到out_exp_res表达式中。
  • if condition:条件语句,可以过滤列表中不符合条件的值。

示例:

# 创建一个包含0到9的平方的列表
>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
 
# 创建一个包含0到9之间的偶数的列表
>>> [x for x in range(10) if x % 2 == 0]
[0, 2, 4, 6, 8]

集合推导式

集合推导式与列表推导式类似,但结果是一个集合,这意味着结果中的元素是唯一的。

集合推导式基本格式:

{ expression for item in Sequence }

或

{ expression for item in Sequence if conditional }

示例:

# 创建一个包含0到9的平方的集合(去重后的结果)
>>> {x**2 for x in range(10)}

# 创建一个包含0到9之间的偶数的集合
>>> {x for x in range(10) if x % 2 == 0}
{0, 2, 4, 6, 8}

字典推导式

字典推导式允许你从现有的可迭代对象创建一个新的字典。

字典推导式基本格式:

{ key_expr: value_expr for value in collection }

或

{ key_expr: value_expr for value in collection if condition }

示例:

# 创建一个字典,键是0到9,值是它们的平方
>>> {x: x**2 for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

# 创建一个字典,键是0到9之间的偶数,值是'even'
>>> {x: 'even' for x in range(10) if x % 2 == 0}
{0: 'even', 2: 'even', 4: 'even', 6: 'even', 8: 'even'}

# 字符串(键值对格式)转换为字典
>>> dict([s.split(':') for s in "a:1,b:2,c:3".split(',')])
{'a': '1', 'b': '2', 'c': '3'}

元组推导式

虽然Python没有直接的元组推导式语法,但你可以使用生成器表达式配合tuple()函数来创建元组。

示例:

# 创建一个包含0到9的平方的元组
>>> tuple(x**2 for x in range(10))
(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)

生成器表达式与列表推导式类似,但它们在需要时才生成值,这对于大型数据集来说更加高效,因为它们不会一次性将所有值加载到内存中。