如果列表理解的一部分,我可以使用最终值吗?
Can I use final value in if part of list comprehension?
假设我有一个从 1 到 10 的数字列表。我想知道这些小于 1000 的数字的平方,我不关心实际数字。这是我正在努力实现的一个简化示例,我想知道单列表理解是否可以做到这一点。
我可以这样做:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares_under_1000 = [n ** 2 for n in numbers if n ** 2 < 1000]
print(squares_under_1000) # Output: [1, 4, 27, 256]
问题是我需要使用实际的平方计算两次 - 我需要自己重复一遍,以防操作缓慢,那就是……慢。
我知道我也可以使用 filter
:
squares_under_1000 = list(filter(lambda sq: sq < 1000, [n ** 2 for n in numbers]))
但我的意思不是换一种方式,因为我已经知道怎么做了。相反:是否可以使用列表理解来计算值并在我的理解的 if
部分中使用该计算值?
这是在 Python 3.8 中添加赋值表达式的理由之一:
>>> [ n2 for n in numbers if (n2 := n ** n) < 1000 ]
[1, 4, 27, 256]
查一下。 (在字典里。)
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = {n: n**2 for n in numbers}
[v for v in squares.values() if v < 1000]
编辑:也可以在第二行中创建另一个列表理解,它会满足您的要求。但如果你也需要原始数字,字典会更好。
P.S。你在原来的 post.
中将 n 提高到它自己
您的 post 要求小于 1000 的数字的平方,但您正在提高自己的数字;也就是说,x**x == x^x。我假设你想要 x^2 == x**2.
@chepner 对 Python 3.8 及更高版本有很好的回答。对于 python 3.8 以下(或者如果你不喜欢海象运算符),嵌套列表理解可能是这里的门票:
numbers = list(range(1,11))
sq_und_1000 = [v for v in [n**2 for n in numbers] if v < 1000]
假设我有一个从 1 到 10 的数字列表。我想知道这些小于 1000 的数字的平方,我不关心实际数字。这是我正在努力实现的一个简化示例,我想知道单列表理解是否可以做到这一点。
我可以这样做:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares_under_1000 = [n ** 2 for n in numbers if n ** 2 < 1000]
print(squares_under_1000) # Output: [1, 4, 27, 256]
问题是我需要使用实际的平方计算两次 - 我需要自己重复一遍,以防操作缓慢,那就是……慢。
我知道我也可以使用 filter
:
squares_under_1000 = list(filter(lambda sq: sq < 1000, [n ** 2 for n in numbers]))
但我的意思不是换一种方式,因为我已经知道怎么做了。相反:是否可以使用列表理解来计算值并在我的理解的 if
部分中使用该计算值?
这是在 Python 3.8 中添加赋值表达式的理由之一:
>>> [ n2 for n in numbers if (n2 := n ** n) < 1000 ]
[1, 4, 27, 256]
查一下。 (在字典里。)
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = {n: n**2 for n in numbers}
[v for v in squares.values() if v < 1000]
编辑:也可以在第二行中创建另一个列表理解,它会满足您的要求。但如果你也需要原始数字,字典会更好。
P.S。你在原来的 post.
中将 n 提高到它自己您的 post 要求小于 1000 的数字的平方,但您正在提高自己的数字;也就是说,x**x == x^x。我假设你想要 x^2 == x**2.
@chepner 对 Python 3.8 及更高版本有很好的回答。对于 python 3.8 以下(或者如果你不喜欢海象运算符),嵌套列表理解可能是这里的门票:
numbers = list(range(1,11))
sq_und_1000 = [v for v in [n**2 for n in numbers] if v < 1000]