【Python基础】推导式(列表、字典、集合)
推导式是一种简洁、高效的语法,用于从一个可迭代对象中生成新的可迭代(iterable)对象。
通常情况下,在以下情况可以考虑使用推导式:
- 只需要简单的表达式来计算新的可迭代对象的元素。
- 可迭代对象不是很大,可以在内存中容纳整个可迭代对象和新生成的可迭代对象。
- 例如,在以下情况下可以使用推导式:
从一个列表中生成一个新的列表,例如[n**2 for n in numbers]。
从一个列表中生成一个新的集合,例如{n for n in numbers}。
从一个列表中生成一个新的字典,例如{n: n**2 for n in numbers}。
Python中有三种类型的推导式:列表推导式、字典推导式和集合推导式。它们的语法如下:
- 列表推导式:
[expression for item in iterable]
- 字典推导式:
{key_expression: value_expression for item in iterable}
- 集合推导式:
{expression for item in iterable}
其中,expression表示要生成的元素表达式,item表示可迭代对象中的元素,key_expression和value_expression分别表示生成字典的键和值的表达式。
一下是简单的使用示例:
列表推导式
numbers = [1, 2, 3, 4, 5]
squares = [n**2 for n in numbers]
print(squares)
# 输出:[1, 4, 9, 16, 25]
字典推导式
# 获取每个名字的长度
names = ['sunwuk', 'zhubajie', 'shaheshang', 'tangseng']
name_length = {name: len(name) for name in names}
print(name_length)
# 输出:{'sunwuk': 6, 'zhubajie': 8, 'shaheshang': 10, 'tangseng': 8}
#将键和值调换位置
names1 = {"name":"孙悟空","age":18,"address":"花果山"}
names2 = {v:k for k,v in names1.items()}
names3 = [[v,k] for k,v in names1.items()]
names4 = [{v, k} for k,v in names1.items()]
print(names2) # {'孙悟空': 'name', 18: 'age', '花果山': 'address'}
print(names3) # [['孙悟空', 'name'], [18, 'age'], ['花果山', 'address']]
print(names4) # [{'孙悟空', 'name'}, {'age', 18}, {'address', '花果山'}]
在上面例子中,我们暂且将names4
外部的[]
看做容器类型,而内部的{}
就是容器内元素的类型
集合推导式
集合推导式也需要使用花括号包裹
numbers = [1, 2, 3, 4, 5, 5, 4, 3, 2, 1]
unique_numbers = {n for n in numbers}
print(unique_numbers)
# 输出:{1, 2, 3, 4, 5}
生成器表达式
生成器表达式与列表推导式非常相似,只是它使用圆括号而不是方括号。下面是一个简单的例子:
gen = (x**2 for x in range(10))
在上面的代码中,我们创建了一个生成器表达式 gen,它可以生成0到9的平方数。要访问生成器表达式中的元素,可以使用 next() 函数或将其转换为迭代器进行迭代:
print(next(gen)) # 输出 0
print(next(gen)) # 输出 1
for num in gen:
print(num) # 输出剩余的元素 4, 9, 16, 25, 36, 49, 64, 81
生成器表达式只能迭代一次。一旦所有元素都被访问过,它就会停止生成新元素。
注意
需要注意的是,列表推导式需要使用中括号
[ ]
来包裹,而字典推导式和集合推导式需要使用花括号{ }
来包裹
当需要进行复杂的计算或涉及多个循环或条件时,推导式可能不是最佳选择,因为它可能会降低代码的可读性和可维护性。在这种情况下,应该考虑使用传统的循环和条件语句来生成新的可迭代对象。
另外,推导式不应该过度嵌套使用,因为它会降低代码的可读性和可维护性。如果推导式变得过于复杂或难以理解,那么可能需要使用其他方式来实现相同的功能。
本文来自博客园,作者:'Radio',转载请注明原文链接:https://www.cnblogs.com/primice/p/17379544.html