我正在尝试为拼图创建一个尽可能短的代码,并且想到尝试做这样的事情时会想到这个问题:
zip(l=[1,2,3,4,5],l[1:])
所以我想知道,有没有办法生成一个值,将它分配给一个变量并在同一行/函数调用中使用该变量?
编辑:为了澄清事情,我知道这件事不推荐也不好,也不会产生更快的结果。此外,问题的实质是在同一函数调用中赋值和重用相同的变量。该列表是使用输入生成的,此处的静态列表仅用于示例。在这样的情况下,我想避免重复相同的任务两次,而我已经在某处产生了结果。答案 0 :(得分:2)
如果这是代码高尔夫的事情,所以必须是单个语句,那么这适用于Python 2:
print[zip(l,l[1:])for l in[[1,2,3,4,5]]][0]
<强>输出强>
[(1, 2), (2, 3), (3, 4), (4, 5)]
否则,
l=[1,2,3,4,5];print zip(l,l[1:])
比上面显示的列表理解滥用更短,远更明智。
C系列中的许多语言都允许分配表达式中的变量。这可能很方便,但它也导致了许多错误,如果在if
条件(例如)内检测到赋值,大多数现代编译器都会生成警告。
这是一个故意的设计决定,不允许在Python中使用那种东西。因此,Python赋值语句不是表达式,因此它没有值。
BTW,Python数据模型与许多其他语言完全不同。 Python doesn't really have variables是值的容器,它包含可能绑定到名称的对象。请注意,在Python 3 zip
中返回迭代器而不是列表,因此如果要生成列表,则需要使用zip
包裹list()
调用。< / p>
答案 1 :(得分:2)
您可以使用lambdas和默认参数来编码高尔夫。强调这不应该在生产代码中使用,而只是展示python中可能的内容。
(lambda l=[1, 2, 3]: zip(l, l[1:]))()
答案 2 :(得分:1)
这是一个黑客,但不是pythonic。实际上,因为您只需要在全局命名空间中创建一个对象,就可以通过预期的对象更新命名空间。
>>> zip(globals().update(a=[1, 2, 3]) or a, a[1:])
[(1, 2), (2, 3)]
由于update()
属性返回None,因此其对象的逻辑or
将是对象本身。
答案 3 :(得分:1)
当然,你总是可以这样做:
l = range(1, 6); zip(l, l[1:])
但我猜这不是你想要的。 : - )
有一种相对干净的方式
(lambda l: zip(l, l[1:]))(range(1, 6))
BTW该函数在itertools recipes中成对定义,因此pairwise(range(1, 6))
可能是最直接的方式。您只需要编写一个从Web页面导入Python函数的导入钩子。 :-D
并且有一种不错的方式
next(zip(l, l[1:]) for l in [range(1, 6)])
如果你想要更多的想法,那就这么说吧。 : - )