सूची में स्ट्रिंग मान खोजें और बदलें


153

मुझे यह सूची मिली:

words = ['how', 'much', 'is[br]', 'the', 'fish[br]', 'no', 'really']

मैं चाहूंगा कि इस तरह से [br]कुछ शानदार मूल्य के साथ प्रतिस्थापित किया जाए <br />और इस प्रकार एक नई सूची प्राप्त हो:

words = ['how', 'much', 'is<br />', 'the', 'fish<br />', 'no', 'really']

जवाबों:


274
words = [w.replace('[br]', '<br />') for w in words]

इन्हें लिस्ट कॉम्प्रिहेंशन कहा जाता है ।


5
इस सूची को समझने की विधि और मानचित्र विधि (@Anthony Kong द्वारा पोस्ट) के बीच तुलना करते हुए, यह सूची विधि लगभग 2x तेज थी। इसके अलावा इसने एक ही कॉल में कई रिप्लेसमेंट डालने की अनुमति दी, जैसेresname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
— स्टीवन सी। हॉवेल

1
@ मेरे पास एक सूची है ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']जहां मैं 'खाली जगह बदलने की कोशिश कर रहा हूं लेकिन यह काम नहीं कर रहा है। हम इसका उपयोग करके इसे कैसे बदल सकते हैं?
— संदीप सिंह

क्या होगा यदि कोई वस्तु फ्लोट / पूर्णांक है?
— देशभक्त

32

आप उदाहरण के लिए उपयोग कर सकते हैं:

words = [word.replace('[br]','<br />') for word in words]

2
@macetw वास्तव में पहला उत्तर।
— कोड इट

टाइमस्टैम्प को देखकर लगता है कि वे दोनों एक ही समय में जवाब दे सकते हैं, शायद यह एक सेकंड के कुछ अंश से देर हो ...
— maksbd19

31

सूची की समझ के साथ, आप नक्शे की कोशिश कर सकते हैं

>>> map(lambda x: str.replace(x, "[br]", "<br/>"), words)
['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']

15

यदि आप विभिन्न तरीकों के प्रदर्शन के बारे में सोच रहे हैं, तो यहां कुछ समय हैं:

In [1]: words = [str(i) for i in range(10000)]

In [2]: %timeit replaced = [w.replace('1', '<1>') for w in words]
100 loops, best of 3: 2.98 ms per loop

In [3]: %timeit replaced = map(lambda x: str.replace(x, '1', '<1>'), words)
100 loops, best of 3: 5.09 ms per loop

In [4]: %timeit replaced = map(lambda x: x.replace('1', '<1>'), words)
100 loops, best of 3: 4.39 ms per loop

In [5]: import re

In [6]: r = re.compile('1')

In [7]: %timeit replaced = [r.sub('<1>', w) for w in words]
100 loops, best of 3: 6.15 ms per loop

जैसा कि आप इस तरह के सरल पैटर्न के लिए देख सकते हैं कि स्वीकृत सूची की समझ सबसे तेज़ है, लेकिन निम्नलिखित को देखें:

In [8]: %timeit replaced = [w.replace('1', '<1>').replace('324', '<324>').replace('567', '<567>') for w in words]
100 loops, best of 3: 8.25 ms per loop

In [9]: r = re.compile('(1|324|567)')

In [10]: %timeit replaced = [r.sub('<\1>', w) for w in words]
100 loops, best of 3: 7.87 ms per loop

इससे पता चलता है कि अधिक जटिल प्रतिस्थापन के लिए पूर्व-संकलित reg-exp (के रूप में 9-10) तेजी से (बहुत) हो सकता है। यह वास्तव में आपकी समस्या और रेग-एक्सप के सबसे छोटे हिस्से पर निर्भर करता है।


3

लूप के लिए एक उदाहरण (मैं सूची समझ पसंद करता हूं)।

a, b = '[br]', '<br />'
for i, v in enumerate(words):
    if a in v:
        words[i] = v.replace(a, b)
print(words)
# ['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.