क्या पायथन में दो में से एक चर को निर्दिष्ट करने का एक छोटा तरीका है?


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 

क्या कोई छोटी विधि या चरित्र-बचत अनुकूलन है? आप मान सकते हैं bकि 0या 1, केवल फाल्सी या ट्रू नहीं है, और यदि यह मदद करता है तो डेटा प्रकारों और मूल्यों के बारे में भी धारणा बना सकता है।


1
मैं कुछ भी बेहतर नहीं जानता। यदि आपको ऐसा करने की आवश्यकता है, तो आप x,y=C(x,y,z,b)(14 चार्ट) कर सकते हैं और इनमें से किसी भी कार्यान्वयन को शरीर में धकेल सकते हैं C
कीथ रान्डेल

स्टैक ओवरफ्लो में ऐसा क्यों नहीं है?
BobTheAwesome

14
@BusTheAwesome मैं यह करने के लिए अच्छे तरीकों के लिए नहीं कह रहा हूं, बस छोटे वाले।
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 वर्ण हैं, जो कि पायथन 3 के लिए अब तक का सबसे अच्छा है, जिसके नियंत्रण प्रवाह के बिना if/elseसमस्याएं हो सकती हैं।
xnor

3
यह वास्तव में ओवरहेड के 9 वर्ण हैं क्योंकि एक नई पंक्ति या अर्धविराम को असाइनमेंट का पालन करना चाहिए।
xnor

1
यदि आपको केवल एक बार करने की आवश्यकता है, तो क्या आप कर सकते हैं vars()["xy"[b]]=z:?
एनाबिस

@acbabis: हाँ, जैसा कि xnor ने बताया है।
कीथ रान्डेल

19

14 वर्ण, अजगर 2

exec"xy=z"[b:]

दो चर रहे हैं yऔर xy। यदि b = 0, यह सेट करता है xy=z। यदि b = 1, यह सेट करता है y=z। यदि xyकोड में एक बार से अधिक उपयोग नहीं किया जाता है तो यह इसके लायक होगा ।


2
बहुत चालाक! मुझे संदेह है कि आपको आमतौर xyपर कम से कम दो बार उपयोग करने की आवश्यकता होती है , हालांकि इसके प्रारंभिक असाइनमेंट के लिए, और बाद में इसे पढ़ने के लिए।
xnor

15

15 वर्ण, अजगर 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या sऔर e
isaacg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.