मैं पायथन में अलियास सदस्य कैसे काम करता हूं?


23

पायथन में, बाइट्स को अलियासिंग फ़ंक्शंस द्वारा बचा सकते हैं जो बार-बार उपयोग किए जाते हैं। उदाहरण के लिए:

r=range
a=r(100)
b=r(200)
c=r(300)

हालाँकि, जब फ़ंक्शन सदस्य कार्य एक साथ होते हैं, तो मुझे नहीं पता कि उन्हें कैसे एक तरह से उर्फ ​​करें जो कि चैनिंग की अनुमति देता है। उदाहरण के लिए:

s='Hello'

// Plain code
s=s.replace('H','J').replace('e','i').replace('l','m').replace('o','y')

// What I am trying to do
q=replace
s=s.q('H','J').q('e','i').q('l','m').q('o','y')

जाहिर है, मैं जो करने की कोशिश कर रहा हूं, वह मान्य नहीं है। और न तो यह है:

q=s.replace
s=q('H','J') // Replaces the 'H' in 'Hello'
s=q('e','i') // Replaces the 'e' in 'Hello'... and the J is gone.
s=q('l','m')
s=q('o','y')

क्या अन्य प्रकार के सदस्य कार्यों और जंजीर कार्यों के लिए एक और तरीका है जो पात्रों को बचाता है?


अपनी विधि को परिभाषित करें, इसकी विधि के साथ इसका qअर्थ है कि replaceकक्षा में आपके उपयोग का क्या अर्थ है।
यपनिप

3
मुझे खुशी है कि यह कम नहीं किया गया है :)
TheDoctor

2
मैंने अभी के लिए सभी उत्तरों को खोल दिया है, लेकिन हम इस और इसी तरह के प्रश्नों के लिए कॉल करने के लिए एक मजबूत पर्याप्त सहमति तक नहीं पहुंचे हैं। यह भी देखें: meta.codegolf.stackexchange.com/q/1555/3808
दरवाज़े

3
अब जब उपर्युक्त मेटा चर्चा अर्ध-आधिकारिक है (या कम से कम हम में से अधिकांश सहमत हैं), मैंने आगे बढ़कर इस पद पर विकि को हटा दिया है।
दरवाज़े

1
आपका अंतिम संस्करण काम नहीं करता है। qउस विशिष्ट strउदाहरण की प्रतिस्थापित विधि से बंधा है । इसके अलावा, याद रखें कि आप सिंगल "Hello".replace(*"HJ")
चार्ज

जवाबों:


28

कोई बात नहीं! आप एक विधि को अन्य नाम दे सकते हैं, लेकिन आपको यह जानना होगा कि इसका उपयोग कैसे करें:

>>> r=str.replace
>>> a='hello'
>>> r(r(r(r(a,'h','j'),'e','i'),'l','m'),'o','y')
'jimmy'

कुंजी यह है कि आपको selfस्पष्ट रूप से पास करना होगा , क्योंकि उपनाम एक प्रकार का फ़ंक्शन है जो एक अतिरिक्त तर्क लेता है self:

>>> type(r)
<type 'method_descriptor'>

3
मैंने इसे पहले कैसे नहीं देखा?
बारिश

6

एक छोटी विधि नाम के साथ, अपनी खुद की कक्षा को परिभाषित करें।

उदाहरण के लिए, यदि आप कक्षा replace()से संबंधित पद्धति का उपयोग कर रहे हैं, तो आप Stringअपनी कक्षा Sको एक विधि कह सकते हैं, qजो समान कार्य करती है।

यहाँ एक कार्यान्वयन है:

class m(str):
 def q(a,b,c):return m(a.replace(b,c))

यहाँ एक बेहतर कार्यान्वयन है:

class m(str):q=lambda a,b,c:m(a.replace(b,c))

इसका इस्तेमाल ऐसे करें:

s="Hello"
s=m(s).q('H','J').q('e','i').q('l','m').q('o','y')

5

यह वैसे भी कुछ अक्षर छोटा है

j=iter('HJeilmoy')
for i in j:s=s.replace(i,next(j))

कम संख्या में प्रतिस्थापन के लिए भी छोटा है

for i in['HJ','ei','lm','oy']:s=s.replace(*i)

बेशक यह सिर्फ एक विशेष मामले को कवर करता है। हालांकि कोड गोल्फ उन सभी विशेष मामलों को खोजने के बारे में है जो आपको बाइट्स बचा सकते हैं।

एक आवरण फ़ंक्शन लिखना संभव है जो सामान्य मामले को संभालता है, लेकिन अधिकांश कोड गोल्फ चुनौतियों में एक स्थान के लिए कोड बहुत बड़ा होगा।

इसके बजाय आपको यह सोचने की ज़रूरत है कि "मैं इस परिवर्तन को कुशलतापूर्वक (स्ट्राइकवेज़) कर सकता हूँ। str.replace के साथ। क्या मैं इसका लाभ उठाने के लिए अपने समाधान का आंतरिक प्रतिनिधित्व बदल सकता हूँ? (लाभ को नकारने के लिए इतने सारे स्ट्रोक बर्बाद किए बिना)"


मुझे यह उत्तर पसंद है क्योंकि यह अच्छी आदतों का वर्णन करता है जब गोल्फिंग और निश्चित रूप से प्रस्तुत विशिष्ट उदाहरण को हल करता है। मैंने एक और उत्तर स्वीकार किया क्योंकि यह अधिक सामान्य मामले पर लागू होता है।
बजे रेनबोल्ट

4

आप reduceफ़ंक्शन का उपयोग कर सकते हैं ।

reduce(lambda s,(a,b):s.replace(a,b),[('H','J'),('e','i'),('l','m'),('o','y')],'Hello')

अपना उत्तर अलग हैं इस सवाल का जवाब (जहां तक तकनीक का इस्तेमाल किया के रूप में, जरूरी में नहीं लिखा सटीक एक ही फार्म)?

1
@Rusher यह अलग है। उदाहरण के लिए लिंक्ड उत्तर में इनवोकेशन की संख्या हार्ड-कोडेड है, जबकि यहां यह केवल दूसरे तर्क की लंबाई (जो किसी भी पुनरावृत्ति हो सकती है) द्वारा दी गई है।
हावर्ड

1

यदि आप बहुत सारे प्रतिकृति कर रहे हैं , तो आप ऐसा कर सकते हैं:

s=''.join({'H':'J','e':'i','l':'m','o':'y'}[a] for a in list(s))

मैं एक ऐसे उत्तर की उम्मीद कर रहा था जो प्रतिस्थापित करने के लिए विशिष्ट नहीं था। मैंने सिर्फ एक उदाहरण के रूप में इसका इस्तेमाल किया है।
बारिश

यह एक बार में केवल 1 चार्ट को बदल सकता है, लेकिन यह मल्टी-चार प्रतिस्थापन को सम्मिलित कर सकता है। और यह पूरी तरह से गोल्फ नहीं है (बाद में अंतरिक्ष को हटा दें [a])
जस्टिन

2
के [a]साथ प्रतिस्थापित करने की आवश्यकता नहीं है .get(a,a)(अन्यथा, हमें कुछ मुख्य त्रुटि चीज़ मिलती है)? और के list(s)बजाय क्यों है s?
जस्टिन

1

कैसे एक लंबो कार्य को परिभाषित करने के बारे में?

r=lambda s,a,b:s.replace(a,b)

s=r(r(r(r(s,'H','J'),'e','i'),'l','m'),'o','y')

1
कोई ज़रूरत नहीं: str.replace/ है / कि भेड़ का बच्चा! मेरा जवाब देखिए।
मटनवार्क

1

यदि आपके प्रतिस्थापन की आवश्यकता नहीं है, तो आप `str.translate 'का उपयोग कर सकते हैं। संख्या ASCII अध्यादेश हैं। इस तरह इसका उपयोग करने के लिए अजगर 3 की आवश्यकता होती है:

print("Hello".translate({72:74,101:105,108:109,111:121}))

इसे ऑनलाइन आज़माएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.