파이썬에서 두 변수 중 하나를 할당하는 더 짧은 방법이 있습니까?


19

이것은 에서 골프를하기위한 질문입니다 .

파이썬에서 수행 한 여러 골프에서 고정 값은 부울에 의해 선택된 두 변수 중 하나에 할당됩니다. 선택한 변수는 주어진 값으로 덮어 쓰고 다른 변수는 변경되지 않습니다.

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

내가 아는 가장 빠른 방법은 파이썬 2 exec를 사용하는 것입니다.

16 자, 파이썬 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 

더 짧은 방법이나 문자 절약 최적화가 있습니까? Falsey 또는 Truthy뿐만 아니라 bis 0또는 이라고 가정 할 수 있으며 1도움이되는 경우 데이터 유형 및 값에 대해 가정 할 수도 있습니다.


1
나는 더 나은 것을 모른다. 이 작업을 많이 수행해야하는 경우 x,y=C(x,y,z,b)(14 자)이 구현을의 본문으로 푸시 할 수 있습니다 C.
Keith Randall

왜 스택 오버플로에서 그렇지 않습니까?
BobTheAwesome

14
@BobTheAwesome 나는 이것을하는 좋은 방법을 요구하지 않고 단지 짧은 방법을 요구합니다.
xnor

답변:


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.
aebabis

@acbabis : 그렇습니다.
Keith Randall

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"

변수가 호출 될 것을 요구 F하고 T대신 x하고 y, 그 b is False또는 b is True오히려 동수 인 이상 0또는 1.

이에서 문자를 저장 "xy"[b]하는 대신 문자열 표현의 첫 글자를 취하여 b이다, T또는 F.


7
변수가라고도 할 수 있음에 유의 a하고 r, l그리고 u하거나 se해당 인덱스와.
isaacg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.