2009-04-18 4 views
22

में स्ट्रिंग प्रतिस्थापन की एक सूची निम्न कोड लिखने का एक बहुत छोटा तरीका है?पायथन

my_string = my_string.replace('A', '1') 
my_string = my_string.replace('B', '2') 
my_string = my_string.replace('C', '3') 
my_string = my_string.replace('D', '4') 
my_string = my_string.replace('E', '5') 

ध्यान दें कि मुझे उन सटीक मानों की प्रतिस्थापित करने की आवश्यकता नहीं है;

mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'} 
for k, v in mapping.iteritems(): 
    my_string = my_string.replace(k, v) 

एक तेजी से दृष्टिकोण आप कोई आपत्ति नहीं है, तो: मैं बस की तुलना में कम 5

उत्तर

44

में 5 + लाइनों चालू करने के लिए एक तरह से तलाश कर रहा हूँ एक पाश का उपयोग करने के लिए एक अच्छा अवसर की तरह लग रहा कोष्ठक होगा:

mapping = [ ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4'), ('E', '5') ] 
for k, v in mapping: 
    my_string = my_string.replace(k, v) 
+1

यह विषम है; जिस तरह से मैं इसे लिखूंगा, क्योंकि समस्या एक चरित्र से दूसरे चरित्र में मैपिंग के बारे में है। लेकिन वास्तव में, आप एक नियम के रूप में dict का उपयोग नहीं कर रहे हैं; आप इसे टुपल्स की सूची के रूप में उपयोग कर रहे हैं। तो क्यों पहली जगह में tuples की एक सूची लिखना नहीं है? –

+0

निश्चित रूप से टुपल्स की एक सूची भी काम करेगी (और तेज हो)। मैं उस विकल्प को शामिल करने के लिए उत्तर संपादित कर दूंगा। –

+2

क्या होगा यदि आपके पास यह मैपिंग {'ए': '1', '1': 'ए'} होगा, तो परिणाम अपेक्षित – muni764

6
replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'}  
for key, replacement in replaceDict.items(): 
    my_string = my_string.replace(key, replacement)
15

इसके अलावा str.translate() पर गौर। यह आपके द्वारा यूनिकोड तारों के लिए प्रदान किए गए मैपिंग के अनुसार वर्णों को प्रतिस्थापित करता है, या अन्यथा यह बताया जाना चाहिए कि प्रत्येक वर्ण को chr (0) से chr (255) से प्रतिस्थापित करना है।

35

आप आसानी से str.translate करने के लिए() मानचित्रण स्ट्रिंग बनाने के लिए string.maketrans() का उपयोग कर सकते पारित करने के लिए:

import string 
trans = string.maketrans("ABCDE","12345") 
my_string = my_string.translate(trans) 
+2

यह अच्छा है, लेकिन बहु-वर्ण पैटर्न या प्रतिस्थापन –

+0

सही के मामले में काम नहीं करता है। मैंने सवाल से यह माना कि यह चरित्र आधारित प्रतिस्थापन था। –

+0

मुझे एक प्रश्न बचाता है, thx – ohho

10

आप गलत जवाब पाने के लिए चाहते हैं, धीरे-धीरे, तो string.replace का उपयोग एक पाश में विशेष के लिए

import re 

def multisub(subs, subject): 
    "Simultaneously perform all substitutions on the subject string." 
    pattern = '|'.join('(%s)' % re.escape(p) for p, s in subs) 
    substs = [s for p, s in subs] 
    replace = lambda m: substs[m.lastindex - 1] 
    return re.sub(pattern, replace, subject) 

>>> multisub([('hi', 'bye'), ('bye', 'hi')], 'hi and bye') 
'bye and hi' 

: संभव ओवरलैप या एक लंबी विषय स्ट्रिंग, उपयोग re.sub साथ सामान्य स्थिति के लिए (यह पैटर्न और प्रतिस्थापन के बीच कोई ओवरलैप के इस मामले में काम करता है हालांकि।)

1-वर्ण पैटर्न और 1- या 0-वर्ण प्रतिस्थापन के मामले, string.maketrans का उपयोग करें।

+0

+1 यह कहने के लिए कि 'string.replace' गलत जवाब देता है, क्योंकि यह बिल्कुल स्पष्ट नहीं है कि ओवरलैपिंग मैचों के लिए * क्या होना चाहिए। तो नेट 0 :) –

+1

str.replace एक तर्कसंगत गलत जवाब दे सकता है। शब्दकोश-आधारित समाधानों के लिए, स्ट्रिंग "वाह" और अनुवाद तालिका {'w': 'foo', 'o': 'bar'} पर विचार करें। जिस आदेश को निर्देश दिया जाता है, उसके आधार पर आप विभिन्न परिणामों के साथ समाप्त हो सकते हैं: "fbarbarbarfbarbar" या "foobarfoo"। एक फ़ंक्शन जो बराबर इनपुट के लिए अलग आउटपुट देता है वह तर्कसंगत रूप से टूटा हुआ है। – Miles

+0

मील, हाँ, यह मेरी तरह की समस्या है।आप अकेले चाबियों में ओवरलैप भी चला सकते हैं, जैसे 'हैलो' और 'नरक'। –

1

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

import re 
    def escapeTexString(string): # Returns TeX-friendly string 
    rep = { # define desired replacements in this dictionary (mapping) 
     '&': '\\&', 
     '%': '\\%', 
     '#': '\\#', 
     '_': '\\_', 
     '{': '\\{', # REGEX Special 
     '}': '\\}', # REGEX Special 
     '~': '\\char"007E{}', # LaTeX Special 
     '$': '\\$', # REGEX Special 
     '\\': '\\char"005C{}', # REGEX/LaTeX Special 
     '^': '\\char"005E{}', # REGEX/LaTeX Special 
     '"': '\\char"FF02{}' 
     } 
    # use these two lines to do the replacement (could be shortened to one line) 
    pattern = re.compile("|".join(map(re.escape,rep.keys()))) # Create single pattern object (key to simultaneous replacement) 
    new_string = pattern.sub(lambda match: rep[match.group(0)], string) 
    return new_string