Có cách nào ngắn hơn để gán một trong hai biến trong Python không?


19

Đây là một câu hỏi để chơi golf trong .

Trong nhiều sân golf tôi đã thực hiện bằng Python, một giá trị cố định được gán cho một trong hai biến được chọn bởi Boolean. Biến được chọn được ghi đè bởi giá trị đã cho và biến còn lại không thay đổi.

17 ký tự:

if b:y=z
else:x=z

Việc gán một giá trị có điều kiện là dễ dàng , nhưng việc gán cho một biến có điều kiện có vẻ khó hiểu. Tôi tự hỏi nếu có một cách ngắn hơn tôi đang thiếu.

Điều này sẽ dễ dàng nếu x,ythay vào đó là một danh sách L, nhưng giả sử bối cảnh yêu cầu tham chiếu đến các biến đủ để viết L[0]L[1]bị cấm. Việc chuyển đổi mất quá nhiều thời gian:

20 ký tự:

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

Cách nhanh nhất mà tôi biết là với Python 2 exec, thật kỳ lạ:

16 ký tự, Python 2:

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

Lựa chọn tuple dường như dài hơn:

18, 19, 18, 18 ký tự:

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 

Có một số phương pháp ngắn hơn hoặc tối ưu hóa tiết kiệm ký tự? Bạn có thể giả sử b0hoặc 1, không chỉ Falsey hay Truthy, và cũng đưa ra các giả định về các loại dữ liệu và giá trị nếu nó giúp.


1
Tôi không biết gì hơn. Nếu bạn cần làm điều này rất nhiều, bạn có thể làm x,y=C(x,y,z,b)(14 ký tự) và đẩy bất kỳ thực hiện nào trong số này vào cơ thể C.
Keith Randall

Tại sao điều này không có trong Stack Overflow?
BobTheAwgie 10/03/2015

14
@BobTheAwgie Tôi không yêu cầu những cách tốt để làm điều này, chỉ là những cách ngắn.
xnor 10/03/2015

Câu trả lời:


26

12 ký tự / bài tập + 9 ký tự trên cao

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

Lưu ý rằng điều này chỉ hoạt động ở phạm vi toàn cầu, nó không hoạt động bên trong một chức năng.


1
Ồ, tôi không biết về điều này. Và thật tuyệt khi Vcập nhật tự động, không cần phải gọi lại chức năng. Vì vậy, điều này phá vỡ ngay cả exectrong hai sử dụng. Ngoài ra, chỉ cần thực hiện vars()["xy"[b]]=zlà 17 ký tự, đây là mức tốt nhất chúng tôi có cho Python 3, mà không có luồng điều khiển if/elsecó thể gây ra sự cố.
xnor 10/03/2015

3
Đó thực sự là 9 ký tự trên đầu vì một dòng mới hoặc dấu chấm phẩy phải tuân theo sự phân công.
xnor

1
Nếu bạn chỉ cần làm một lần, bạn có thể làm : vars()["xy"[b]]=z?
aebabis 11/03/2015

@acbabis: có, như xnor đã chỉ ra.
Keith Randall

19

14 ký tự, Python 2

exec"xy=z"[b:]

Hai biến là yxy. Nếu b = 0, bộ này xy=z. Nếu b = 1, bộ này y=z. Điều này sẽ có giá trị nếu xyđược sử dụng không quá một lần ở nơi khác trong mã.


2
Rất thông minh! Tôi nghi ngờ bạn thường cần sử dụng xyít nhất hai lần, cho nhiệm vụ ban đầu và sau đó đọc nó ra.
xnor 10/03/2015

15

15 ký tự, Python 2

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

Yêu cầu các biến được gọi FTthay vì xy, và, b is Falsehoặc b is True, thay vì là các số bằng nhau 0hoặc 1.

Điều này lưu một char từ "xy"[b]thay vì lấy chữ cái đầu tiên của biểu diễn chuỗi b, Thoặc là F.


7
Lưu ý rằng các biến cũng có thể được gọi ar, lu, se, với các chỉ số thích hợp.
isaacg 11/03/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.