यहाँ इतना है कि यह आप क्या चाहते हैं करता है कैसे अपने मौजूदा कोड को संशोधित करने के लिए। मैंने मानक पायथन शैली सम्मेलन के अनुरूप newWord
new_word
बदल दिया है।
def replace(char, word1, word2):
new_word = ""
for i in range(len(word2)):
if word1[i] == char:
new_word += char
else:
new_word += word2[i]
return new_word
# Test
print(replace("p", "apple", "12345"))
उत्पादन
1pp45
नोट यदि word1
word2
तुलना में कम है कि इस कोड एक IndexError: string index out of range
अपवाद बढ़ा देंगे।
इस फ़ंक्शन को लागू करने के कई बेहतर तरीके हैं। सबसे पहले, हम zip
फ़ंक्शन का उपयोग समानांतर में दोनों तारों के अक्षरों पर फिर से करने के लिए कर सकते हैं। पात्रों तक पहुंचने के लिए तारों के सूचकांक का उपयोग करके यह आपके अप्रत्यक्ष पुनरावृत्ति से थोड़ा सा क्लीनर है।
def replace(char, word1, word2):
new_word = ""
for c1, c2 in zip(word1, word2):
if c1 == char:
new_word += char
else:
new_word += c2
return new_word
ध्यान दें कि यदि तार की लम्बाई समान नहीं हैं तो zip
शान से जब छोटे स्ट्रिंग खत्म बंद हो जाएगा।
हम if... else
ब्लॉक को एक सशर्त अभिव्यक्ति के साथ बदलकर उस कोड को अधिक कॉम्पैक्ट बना सकते हैं।
def replace(char, word1, word2):
new_word = ""
for c1, c2 in zip(word1, word2):
new_word += char if c1 == char else c2
return new_word
एक और अधिक उन्नत संस्करण एक सूची समझ का उपयोग करता वांछित वर्णों की एक सूची है और एक स्ट्रिंग में उस सूची कन्वर्ट करने के लिए स्ट्रिंग .join
विधि बनाने के लिए।
def replace(char, word1, word2):
return ''.join([char if c1 == char else c2
for c1, c2 in zip(word1, word2)])
जनरेटर अभिव्यक्ति का उपयोग करके ऐसा करना भी संभव है।
''.join(char if c1 == char else c2 for c1, c2 in zip(word1, word2))
हालांकि कि कारण तरीका है कि .join
कार्यों के लिए, एक सूची समझ का उपयोग करने से कम कुशल है। .join
को दो बार अपना तर्क स्कैन करना होगा: पहला स्कैन आउटपुट स्ट्रिंग के कुल आकार की गणना करने के लिए उपयोग किया जाता है, दूसरा स्कैन वास्तविक जुड़ाव करता है। लेकिन आप जनरेटर को दो बार स्कैन नहीं कर सकते हैं, इसलिए यदि आप .join
पास करते हैं तो जनरेटर को जनरेटर से अस्थायी सूची बनाना पड़ता है।
आपको अपने कोड उदाहरण के इंडेंटेशन को ठीक करना चाहिए। – Carpetsmoker