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


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.