एक स्ट्रिंग में एक चरित्र के उदाहरणों को बदलना


120

यह सरल कोड जो केवल कॉलनों द्वारा अर्धविराम (i-निर्दिष्ट पोस्ट पर) को बदलने का प्रयास करता है:

for i in range(0,len(line)):
     if (line[i]==";" and i in rightindexarray):
         line[i]=":"

यह त्रुटि देता है

line[i]=":"
TypeError: 'str' object does not support item assignment

कॉलन द्वारा अर्धविराम को बदलने के लिए मैं इसके चारों ओर कैसे काम कर सकता हूं? रिप्लेस का उपयोग करने से काम नहीं चलता है क्योंकि फ़ंक्शन कोई इंडेक्स नहीं लेता है - कुछ अर्धविराम हो सकते हैं जिन्हें मैं बदलना नहीं चाहता।

उदाहरण

स्ट्रिंग में मेरे पास अर्धविराम की कोई भी संख्या हो सकती है, उदाहरण के लिए "Hei der!! Hello? There?";

मुझे पता है कि मैं किन लोगों को प्रतिस्थापित करना चाहता हूं (मेरे पास स्ट्रिंग में उनका सूचकांक है)। प्रतिस्थापन का उपयोग करना काम नहीं करता है क्योंकि मैं इसके साथ एक सूचकांक का उपयोग करने में सक्षम नहीं हूं।


1
क्या आप str.replace()BIF जानते हैं ?
लार्सविगास

2
हां, जैसा कि मैंने सवाल में बताया है। मैंने यह भी समझाया कि मेरे लिए काम क्यों नहीं करता।
अनफिन कैट ऑक्ट

str.find() अर्धविराम की स्थिति का पता लगाने के बजाय का उपयोग करें , फिर सबस्ट्रिंग निकालने के लिए स्लाइसिंग का उपयोग करें।
LarsVegas

1
आपको एक मान्य प्रतिस्थापन के गठन में और अधिक विशिष्ट होने की आवश्यकता है; यदि आपके गैर-कार्यशील कोड सभी अर्धविरामों को स्ट्रिंग में बदल देंगे, यदि यह परिवर्तनशील थे।
मार्टिन पीटर्स

1
@ TheUnfunCat: आप पहली बार में सूचकांक कैसे प्राप्त कर रहे हैं? पूरी बात के लिए एक बेहतर समाधान हो सकता है (उदाहरण के लिए regexes)
nneonneo

जवाबों:


207

अजगर में स्ट्रिंग्स अपरिवर्तनीय हैं, इसलिए आप उन्हें एक सूची के रूप में नहीं मान सकते हैं और सूचकांकों को असाइन कर सकते हैं।

.replace()इसके बजाय उपयोग करें :

line = line.replace(';', ':')

यदि आपको केवल कुछ अर्धविरामों को बदलने की आवश्यकता है , तो आपको अधिक विशिष्ट होने की आवश्यकता होगी। आप स्ट्रिंग के अनुभाग को अलग करने के लिए स्लाइसिंग का उपयोग कर सकते हैं:

line = line[:10].replace(';', ':') + line[10:]

यह स्ट्रिंग के पहले 10 अक्षरों में सभी अर्ध-कॉलनों को बदल देगा।


क्या यह यूनिकोड वर्णों के साथ काम करता है? यह मेरे लिए काम नहीं लगता है।
स्टीवन 2163712

@ Steven2163712: सभी पाठ यूनिकोड है, हां, यह सभी वर्णों के साथ ठीक काम करता है। एक ठोस उदाहरण के बिना मैं आपकी विशिष्ट समस्या को ठीक करने में आपकी मदद नहीं कर सकता।
मार्टिन पीटर्स

62

यदि आप उपयोग नहीं करना चाहते हैं, तो आप नीचे दिए गए सूचकांक में किसी भी चार्ट को बदलने के लिए कर सकते हैं .replace()

word = 'python'
index = 4
char = 'i'

word = word[:index] + char + word[index + 1:]
print word

o/p: pythin

7
यह स्वीकृत उत्तर होना चाहिए, सीधे प्रश्न का उत्तर देना चाहिए। यह अब तक का सबसे आसान तरीका है।
भड़की बिल्ली

24

स्ट्रिंग को सूची में बदल दें; तब आप वर्णों को अलग-अलग बदल सकते हैं। तो आप इसे वापस एक साथ रख सकते हैं .join:

s = 'a;b;c;d'
slist = list(s)
for i, c in enumerate(slist):
    if slist[i] == ';' and 0 <= i <= 3: # only replaces semicolons in the first part of the text
        slist[i] = ':'
s = ''.join(slist)
print s # prints a:b:c;d

6

यदि आप एकल अर्धविराम बदलना चाहते हैं:

for i in range(0,len(line)):
 if (line[i]==";"):
     line = line[:i] + ":" + line[i+1:]

हालांकि हेवेंट ने इसका परीक्षण किया।


3
यह काम करेगा (+1), लेकिन काफी अक्षम है, जैसा कि आप हर बार एक नया स्ट्रिंग बना रहे हैं, जब आप एक '' का सामना करते हैं;
इंस्पेक्टरगैजेट

@ inspectorG4dget, आप सही कह रहे हैं, इसका एक त्वरित और गंदा - केवल एक बार - समाधान।
विक

वास्तव में, @ इंस्पेक्टरगैजेट, स्वीकार किए गए उत्तर को एक ही समस्या से ग्रस्त नहीं करता है?
विक

2
line.replace(src,dst)नहीं करता। line[:10].replace(src,dst) + line[10:]करता है, लेकिन बहुत कम गंभीरता में। मान लीजिए line = ';'*12। आपका समाधान 12 बार एक नया स्ट्रिंग बनाएगा। स्वीकृत समाधान एक बार ऐसा करेगा।
इंस्पेक्टरगेट

3

यह थोड़ा और सामान्य मामला कवर करना चाहिए, लेकिन आपको इसे अपने उद्देश्य के लिए अनुकूलित करने में सक्षम होना चाहिए

def selectiveReplace(myStr):
    answer = []
    for index,char in enumerate(myStr):
        if char == ';':
            if index%2 == 1: # replace ';' in even indices with ":"
                answer.append(":")
            else:
                answer.append("!") # replace ';' in odd indices with "!"
        else:
            answer.append(char)
    return ''.join(answer)

उम्मीद है की यह मदद करेगा


3

आप केवल स्ट्रिंग में किसी वर्ण के लिए मान निर्दिष्ट नहीं कर सकते। किसी विशेष वर्ण के मान को बदलने के लिए इस विधि का उपयोग करें:

name = "India"
result=name .replace("d",'*')

आउटपुट: * ia में

इसके अलावा, यदि आप पहले चरित्र के सभी घटनाओं के लिए कहना * को बदलना चाहते हैं, जैसे कि पहले चरित्र को छोड़कर। string = babble आउटपुट = ba ** le

कोड:

name = "babble"
front= name [0:1]
fromSecondCharacter = name [1:]
back=fromSecondCharacter.replace(front,'*')
return front+back

1

यदि आप चर 'n' में निर्दिष्ट सूचकांक मान से बदल रहे हैं, तो नीचे की कोशिश करें:

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str

1
इस समाधान के साथ समस्या यह है कि स्थिति n पर चरित्र की सभी घटनाओं को प्रतिस्थापित किया जाएगा और
प्रश्नकर्ता

बिल्कुल, खराब समाधान!
एरहद डिनोब्ल

1

इस बारे में कैसा है:

sentence = 'After 1500 years of that thinking surpressed'

sentence = sentence.lower()

def removeLetter(text,char):

    result = ''
    for c in text:
        if c != char:
            result += c
    return text.replace(char,'*')
text = removeLetter(sentence,'a')

1

उदाहरण के लिए एक अलग सूची बनाए बिना स्ट्रिंग पर प्रभावी रूप से स्ट्रिंग पर .replace () विधि का उपयोग करने के लिए कुछ सफेद स्थान के साथ स्ट्रिंग वाले उपयोगकर्ता नाम पर एक नज़र डालें, हम प्रत्येक उपयोगकर्ता नाम स्ट्रिंग में एक अंडरस्कोर के साथ सफेद स्थान को बदलना चाहते हैं।

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

प्रत्येक उपयोगकर्ता नाम में सफेद रिक्त स्थान को बदलने के लिए अजगर में रेंज फ़ंक्शन का उपयोग करने पर विचार करें।

for i in range(len(usernames)):
    usernames[i] = usernames[i].lower().replace(" ", "_")

print(usernames)

0

एक विशिष्ट सूचकांक में एक चरित्र को बदलने के लिए, फ़ंक्शन निम्नानुसार है:

def replace_char(s , n , c):
    n-=1
    s = s[0:n] + s[n:n+1].replace(s[n] , c) + s[n+1:]
    return s

जहां s एक स्ट्रिंग है, n इंडेक्स है और c एक कैरेक्टर है।


0

मैंने वर्णों को बदलने या किसी विशिष्ट उदाहरण पर स्ट्रिंग को बदलने के लिए यह विधि लिखी। इंस्टेंस 0 से शुरू होता है (इसे आसानी से 1 में बदला जा सकता है यदि आप वैकल्पिक इंस्टेंस तर्क को 1 में बदलते हैं, और test_instance वेरिएबल को 1 में बदल देते हैं।

def replace_instance(some_word, str_to_replace, new_str='', inst=0):
    return_word = ''
    char_index, test_instance = 0, 0
    while char_index < len(some_word):
        test_str = some_word[char_index: char_index + len(str_to_replace)]
        if test_str == str_to_replace:
            if test_instance == inst:
                return_word = some_word[:char_index] + new_str + some_word[char_index + len(str_to_replace):]
                break
            else:
                test_instance += 1
        char_index += 1
    return return_word

0

तुम यह केर सकते हो:

string = "this; is a; sample; ; python code;!;" #your desire string
result = ""
for i in range(len(string)):
    s = string[i]
    if (s == ";" and i in [4, 18, 20]): #insert your desire list
        s = ":"
    result = result + s
print(result)

0

नाम = ["जॉय ट्रिबेनी", "मोनिका गेलर", "चैंडलर बिंग", "फोएबे बफे"]

उपयोगकर्ता नाम = []

for i in names:
    if " " in i:
        i = i.replace(" ", "_")
    print(i)

o, p Joey_Tribbiani मोनिका_गेलर चांडलर_Bing Phoebe_Buffay


1
धन्यवाद, मुहम्मद मैं एक शुरुआती हूं, मैं अपना सर्वश्रेष्ठ प्रदर्शन करूंगा।
कासेम ००00
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.