有没有一种较短的方法来分配Python中的两个变量之一?


19

这是在打高尔夫球的问题。

在用Python完成的多次高尔夫球比赛中,将固定值分配给布尔值选择的两个变量之一。所选变量被给定值覆盖,另一个不变。

17个字符:

if b:y=z
else:x=z

分配条件值很容易,但是分配给条件变量似乎很麻烦。我想知道是否缺少更短的方法。

如果x,y是列表L,这将很容易,但是假设上下文需要引用足够多的变量以致于编写L[0]L[1]过于禁止。转换时间太长:

20个字符:

L=[x,y];L[b]=z;x,y=L

我知道最快的方法是使用Python 2 exec,这很奇怪:

16个字符,Python 2:

exec"xy"[b]+"=z"

元组选择似乎更长:

18、19、18、18个字符:

x,y=b*(x,z)or(z,y)
x,y=[z,x,y,z][b::2]
y,x=[y,z,x][b:b+2]
y,x,*_=[y,z,x][b:]   # Python 3 

是否有一些较短的方法或节省字符的优化?您可以假设bis 01,不仅是Falsey或Truthy,还可以对数据类型和值进行假设(如果有帮助的话)。


1
我什么都不知道。如果您需要大量执行此操作,则可以做x,y=C(x,y,z,b)(14个字符)并将这些实现中的任何一个都推入的主体中C
基思·兰德尔

为什么在Stack Overflow中没有呢?
BobTheAwesome

14
@BobTheAwesome我不是在要求很好的方法来做到这一点,只是简短的方法。
xnor

Answers:


26

12个字符/分配+ 9个字符间接费用

V=vars()     # do once at the start of the program
V["xy"[b]]=z

请注意,这仅适用于全局范围,不适用于函数内部。


1
哇,我对此一无所知。V自动更新很酷,无需再次调用该函数。因此,这exec在两个用途中均能达到收支平衡。另外,仅做vars()["xy"[b]]=z17个字符,这是迄今为止我们对Python 3最好的,它的控制流if/else可能会导致问题。
xnor

3
实际上这是9个字符的开销,因为必须在分配之后加上换行符或分号。
xnor

1
如果你只需要做一次,你可以这样做:vars()["xy"[b]]=z
eebabis 2015年

@acbabis:是的,正如xnor指出的那样。
基思·兰德尔

19

14个字符,Python 2

exec"xy=z"[b:]

这两个变量是yxy。如果b = 0,则设置xy=z。如果b = 1,则设置y=z。如果xy在代码中的其他地方使用不超过一次,这将是值得的。


2
非常聪明!我怀疑您通常需要xy至少两次使用它进行初始分配,然后再读出来。
xnor

15

15个字符,Python 2

exec`b`[0]+"=z"

要求调用变量FT而不是xand y,并且要求b is Falseor b is True,而不是相等的数字0or 1

这从节省炭"xy"[b]通过而不采取的字符串表示的第一个字母b,这是TF


7
请注意,也可以使用适当的索引来调用变量a和和rluse
isaacg 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.