Python 使用walrus运算符的替代方法:=在嵌套表达式中

Python 使用walrus运算符的替代方法:=在嵌套表达式中,python,walrus-operator,Python,Walrus Operator,比方说,为了演示,我必须获取一个“输入点”列表,并从这些点开始输出三对数字: 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)

比方说,为了演示,我必须获取一个“输入点”列表,并从这些点开始输出三对数字:

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
我还可以通过列表理解更简洁地执行此操作,使用walrus操作符避免反复调用
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
points=[1,12,42,69]
结果=[
[
str(tup)
对于zip中的tup((y:=范围(p,p+6))[::2],y[1::2])
]
对于起始点中的p
]
#产生以下错误:
文件“”,第4行
SyntaxError:赋值表达式不能用于可解析表达式
提到实现赋值运算符的问题是其根源:

由于参考实现中的设计限制(符号表分析器无法轻易检测最左侧的理解可重用表达式和理解的其余部分之间的名称何时被重复使用),命名表达式完全不允许作为理解可重用表达式的一部分(每个“in”后面的部分),并且在任何后续的“如果”或“for”关键字之前)


这让我很失望。除了将其扩展为一个完整的
for
循环之外,还有其他变通方法吗?

实现这一点的经典方法是:

[
  [tup for y in [range(p, p + 6)] for tup in zip(y[::2], y[1::2])]
  for p in points
]
然而,这相当难看(并且需要为每个p构造额外的列表/元组)

您可以通过以下方式避免整个系列/拉链:

[[(y, y + 1) for y in range(p, p + 6, 2)] for p in points]

我相信这会使它更具可读性(也会稍微快一点,因为它避免了对每个p进行zip和3个范围内的2个调用)。

实现这一点的经典方法是:

[
  [tup for y in [range(p, p + 6)] for tup in zip(y[::2], y[1::2])]
  for p in points
]
然而,这相当难看(并且需要为每个p构造额外的列表/元组)

您可以通过以下方式避免整个系列/拉链:

[[(y, y + 1) for y in range(p, p + 6, 2)] for p in points]

我相信这会使它更具可读性(而且速度会稍微快一些,因为它避免了zip和对每个p的3次范围调用中的2次)。

在[range(p,p+6)]中为y插入一个
?@superbrain我想这就是我要找的。在[range(p,p+6)]中为y插入一个
?@superbrain我想这就是我要找的。