जवाबों:
तार को संशोधित न करें।
सूचियों के रूप में उनके साथ काम करें; जरूरत पड़ने पर ही उन्हें तार में घुमाएं।
>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'
अजगर के तार अपरिवर्तनीय हैं (अर्थात उन्हें संशोधित नहीं किया जा सकता है)। कर रहे हैं एक बहुत इस के लिए कारणों में से। जब तक आपके पास कोई विकल्प न हो, तब तक सूचियों का उपयोग करें, तभी उन्हें तार में बदल दें।
MID
स्लाइस के कारण जैसी चीजों की कोई आवश्यकता नहीं है :s[:index] + c + s[index+1:]
इसके तीन तरीके हैं। गति चाहने वालों के लिए मैं 'विधि 2' सुझाता हूँ
विधि 1
इस उत्तर द्वारा दिया गया
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
'मेथड 2' की तुलना में यह काफी धीमा है
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
विधि 2 (फास्ट विधि)
इस उत्तर द्वारा दिया गया
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
जो बहुत तेज है:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
विधि 3:
बाइट सरणी:
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
सबसे तेज दो बार।
new = text[:1] + 'Z' + text[2:]
अजगर के तार अपरिवर्तनीय हैं, आप उन्हें कॉपी बनाकर बदलते हैं।
सबसे आसान तरीका है कि आप क्या चाहते हैं:
text = "Z" + text[1:]
text[1:]
रिटर्न में स्ट्रिंग text
समाप्त करने के लिए स्थिति 1 से, पदों 0 से गिनती तो '1' दूसरा चरित्र है।
संपादित करें: आप स्ट्रिंग के किसी भी भाग के लिए उसी स्ट्रिंग स्लाइसिंग तकनीक का उपयोग कर सकते हैं
text = text[:1] + "Z" + text[2:]
या यदि पत्र केवल एक बार प्रकट होता है तो आप नीचे दी गई खोज और प्रतिस्थापित तकनीक का उपयोग कर सकते हैं
अजगर 2.6 और अजगर 3 के साथ शुरू करके आप बायट्रायर्स का उपयोग कर सकते हैं जो परस्पर हैं (तार के विपरीत तत्व-वार बदला जा सकता है):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
संपादित करें: बदलकर s करने के लिए
edit2: जैसा कि टू-बिट अल्केमिस्ट ने टिप्पणियों में उल्लेख किया है, यह कोड यूनिकोड के साथ काम नहीं करता है।
bytearray(s)
, नहीं bytearray(str)
। दूसरे के लिए, यह उत्पादन करेगा TypeError: string argument without an encoding
:। यदि आप एन्कोडिंग निर्दिष्ट करते हैं, तो आप प्राप्त करते हैं TypeError: an integer is required
। यही पायथन 3 या पायथन 2 के यूनिकोड के साथ है। यदि आप पायथन 2 (एक सही दूसरी पंक्ति के साथ) में ऐसा करते हैं, तो यह गैर-एएससीआईआई पात्रों के लिए काम नहीं करेगा क्योंकि वे सिर्फ एक बाइट नहीं हो सकते हैं। इसके साथ प्रयास करें s = 'Héllo'
और आपको मिलेगा 'He\xa9llo'
।
s = u'abcdefg'
।
जैसा कि अन्य लोगों ने कहा है, आमतौर पर पायथन तार अपरिवर्तनीय माना जाता है।
हालाँकि, यदि आप CPython, python.org पर कार्यान्वयन का उपयोग कर रहे हैं, तो मेमोरी में स्ट्रिंग संरचना को संशोधित करने के लिए ctypes का उपयोग करना संभव है।
यहां एक उदाहरण है जहां मैं एक स्ट्रिंग को खाली करने के लिए तकनीक का उपयोग करता हूं।
अजगर में संवेदनशील के रूप में मार्क डेटा
मैं इसे संपूर्णता के लिए उल्लेख करता हूं, और यह आपका अंतिम उपाय होना चाहिए क्योंकि यह हैकिश है।
str
तो यह आपके लिए सही प्रकार नहीं है। बस इसका उपयोग न करें। bytearray
इसके बजाय कुछ का उपयोग करें । (बेहतर अभी भी, इसे किसी ऐसी चीज़ में लपेटें जिससे आप इसे अपारदर्शी डेटा के रूप में अधिक या कम मान सकते हैं ताकि आप वास्तव में प्रभावित होंstr
, ताकि आप दुर्घटनाओं से बचाने के लिए इसे से पुनः प्राप्त न कर सकें । इसके लिए एक पुस्तकालय हो सकता है। कोई विचार नहीं है।)
यह कोड मेरा नहीं है। मुझे वह साइट फ़ॉर्म याद नहीं आ रहा है, जहाँ मैंने उसे लिया था। दिलचस्प बात यह है कि आप इसका उपयोग एक चरित्र या एक से अधिक चौराहों को बदलने के लिए कर सकते हैं। हालांकि यह उत्तर बहुत देर से आया है, मेरे जैसे नौसिखिए (कभी भी) इसे उपयोगी पा सकते हैं।
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
। mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
। डॉक्टर से लिंक
दरअसल, स्ट्रिंग्स के साथ, आप ऐसा कुछ कर सकते हैं:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
असल में, मैं एक नए तार में एक साथ "+" तार जोड़ रहा हूं :)।
मैं एक स्ट्रिंग में एक चरित्र को बदलने का एक और तरीका जोड़ना चाहूंगा।
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
स्ट्रिंग को सूची में बदलने और ith मान को बदलने के बाद फिर से जुड़ने की तुलना में यह कितना तेज है।
सूची दृष्टिकोण
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
मेरा समाधान
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526