【发布时间】:2020-08-30 17:22:49
【问题描述】:
比如说,为了演示,我必须取一个“输入点”列表,并输出从这些点开始的三对数字:
1 -> [(1, 2), (3, 4), (5, 6)]
12 -> [(12, 13), (14, 15), (16, 17)]
...
我可以在扩展的 for 循环中做到这一点:
points = [1, 12, 42, 69] # arbitrary inputs
result = []
for point in points:
rng = range(points, points + 6)
pairs = list(zip(rng[::2], rng[1::2]))
result.append(pairs)
return result
我还可以通过列表理解更简洁地做到这一点,使用海象运算符来避免一遍又一遍地调用range():
points = [1, 12, 42, 69]
result = [
list(zip((y := range(p, p + 6))[::2], y[1::2]))
for p in startpoints
]
但是,如果我想使用列表解析而不是 list(),并进一步处理 zip() 的结果(例如,将我的输出作为字符串获取),我不能这样做:
points = [1, 12, 42, 69]
result = [
[
str(tup)
for tup in zip((y := range(p, p + 6))[::2], y[1::2])
]
for p in startpoints
]
# produces the following error:
File "<stdin>", line 4
SyntaxError: assignment expression cannot be used in a comprehension iterable expression
PEP 572 提到实现赋值运算符的问题是其根源:
由于参考实现中的设计限制(符号表分析器无法轻易检测到名称何时在最左边的可迭代表达式和其余的理解之间重用),命名表达式完全不允许作为理解可迭代表达式(每个“in”之后,以及任何后续“if”或“for”关键字之前的部分)
这让我很失望。除了将其扩展为完整的for 循环之外,还有其他解决方法吗?
【问题讨论】:
-
插入
for y in [range(p, p + 6)]? -
@superbrain 我想这就是我想要的。