มีวิธีที่สั้นกว่าในการกำหนดหนึ่งในสองตัวแปรใน Python หรือไม่?


19

นี่คือคำถามสำหรับการเล่นกอล์ฟในหลาม

ในหลาย ๆ กอล์ฟที่ฉันทำใน Python ค่าคงที่จะถูกกำหนดให้กับหนึ่งในสองตัวแปรที่เลือกโดยบูลีน ตัวแปรที่เลือกจะถูกเขียนทับโดยค่าที่กำหนดและตัวแปรอื่นจะไม่เปลี่ยนแปลง

17 ตัวอักษร:

if b:y=z
else:x=z

การกำหนดค่าตามเงื่อนไขนั้นเป็นเรื่องง่ายแต่การกำหนดให้กับตัวแปรตามเงื่อนไขนั้นดูเหมือนว่าเป็น clunky ฉันสงสัยว่ามีวิธีที่สั้นกว่าฉันหายไป

นี่จะเป็นเรื่องง่ายถ้า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"

Tuple-selection ดูเหมือนจะยาวกว่า:

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 

มีวิธีที่สั้นกว่าหรือการเพิ่มประสิทธิภาพการประหยัดอักขระ? คุณสามารถสันนิษฐานได้ว่าbเป็น0หรือ1ไม่ใช่แค่ Falsey หรือ Truthy และยังตั้งสมมติฐานเกี่ยวกับชนิดข้อมูลและค่าหากช่วยได้


1
ฉันไม่รู้อะไรเลยดีกว่า หากคุณต้องการจะทำเช่นนี้เป็นจำนวนมากที่คุณสามารถทำได้x,y=C(x,y,z,b)(14 ตัวอักษร) และผลักดันใด ๆ Cของการใช้งานเหล่านี้เข้าไปในร่างกายของ
Keith Randall

เหตุใดจึงไม่เป็นเช่นนี้ใน Stack Overflow
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]]=zคือตัวอักษร 17 ตัวซึ่งดีที่สุดที่เรามีสำหรับ Python 3 โดยไม่มีการควบคุมการไหลif/elseซึ่งอาจทำให้เกิดปัญหา
xnor

3
จริงๆแล้วมันมีค่าใช้จ่ายถึง 9 ตัวอักษรเพราะขึ้นบรรทัดใหม่หรืออัฒภาคต้องปฏิบัติตามที่ได้รับมอบหมาย
xnor

1
ถ้าคุณจะต้องทำเพียงครั้งเดียวที่คุณสามารถทำได้vars()["xy"[b]]=z?
aebabis

@ acbabis: ใช่ xnor ชี้ให้เห็น
Keith Randall

19

14 ตัวอักษร Python 2

exec"xy=z"[b:]

ทั้งสองตัวแปรและy xyถ้า 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แทนที่จะเป็นตัวเลขที่เท่ากับหรือ01

นี้ช่วยประหยัดถ่านจาก"xy"[b]โดยการแทนตัวอักษรตัวแรกของการเป็นตัวแทนสตริงของbซึ่งเป็นหรือTF


7
โปรดทราบว่าตัวแปรยังสามารถเรียกว่าaและr, lและuหรือsและeมีดัชนีที่เหมาะสม
isaacg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.