पायथन में तारों के एक सेट से विशिष्ट सब्सट्रिंग को कैसे निकालना है?


160

मेरे पास स्ट्रिंग्स का एक सेट है set1, और सभी स्ट्रिंग्स में set1एक दो विशिष्ट सब्सट्रिंग्स हैं, जिनकी मुझे आवश्यकता नहीं है और हटाना चाहते हैं।
नमूना इनपुट: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
तो बुनियादी तौर पर मैं चाहता हूँ .goodऔर .badसभी स्ट्रिंग्स से हटा सबस्ट्रिंग।
मैंने क्या कोशिश की:

for x in set1:
    x.replace('.good','')
    x.replace('.bad','')

लेकिन यह बिल्कुल काम नहीं करता है। आउटपुट में कोई बदलाव नहीं हुआ है और यह इनपुट के समान ही है। मैं for x in list(set1)मूल एक के बजाय का उपयोग करने की कोशिश की, लेकिन वह कुछ भी नहीं बदलता है।

जवाबों:


187

तार अपरिवर्तनीय हैं। string.replace(python 2.x) या str.replacepython 3.x) एक नया स्ट्रिंग बनाता है । यह प्रलेखन में कहा गया है:

स्ट्रिंग की एक प्रति लौटाएं जिसमें पुराने के स्थान पर नए द्वारा प्रतिस्थापित सभी घटनाएँ हों। ...

इसका मतलब है कि आपको सेट को फिर से आवंटित करना होगा या इसे फिर से पॉप्युलेट करना होगा (पुन: आवंटन सेट की समझ से आसान है ) :

new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}

3
string.replace()अजगर 3.x पर पदावनत किया जाता है, अब यह हैstr.replace()
Yossarian42

71
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replaceस्ट्रिंग को नहीं बदलता है, यह प्रतिस्थापन के साथ स्ट्रिंग की एक प्रति लौटाता है। आप सीधे स्ट्रिंग को बदल नहीं सकते क्योंकि तार अपरिवर्तनीय हैं।

आपको रिटर्न मानों को x.replaceनए सेट में रखने और लेने की जरूरत है ।


लेकिन जब मैं स्ट्रिंग्स के सेट पर लूप करता हूं, तो मैं एक नए सेट को कैसे अपडेट कर सकता हूं? set_name.update का उपयोग कर रहे हैं? क्या आप दिखा सकते हैं?
कंट्रोलफ्रीक

12

आप सभी की जरूरत काले जादू का एक सा है!

>>> a = ["cherry.bad","pear.good", "apple.good"]
>>> a = list(map(lambda x: x.replace('.good','').replace('.bad',''),a))
>>> a
['cherry', 'pear', 'apple']

5

आप ऐसा कर सकते हैं:

import re
import string
set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}

for x in set1:
    x.replace('.good',' ')
    x.replace('.bad',' ')
    x = re.sub('\.good$', '', x)
    x = re.sub('\.bad$', '', x)
    print(x)

2
लाइन x.replace('.good',' ')और x.replace('.bad',' ')अंतिम परिणाम के लिए कुछ भी नहीं करता है। उनके बिना प्रिंट आउट समान होगा।
सीन पोपिएक

इसके अलावा, मैं re.subइस तरह सिर्फ एक लाइन के साथ होगा , जैसे:x = re.sub('((\.good$)|(\.bad$))', '', x)
श्रीमान पोपिक

@ Sr @anPopić हाँ, मैं आपसे सहमत हूँ
विवेक

क्या हमें उसके अनुसार संपादन करना चाहिए? ( replaceएस हटाएं और सब कुछ एक re.subकॉल पर ले जाएं)
सीन पोपिएक

1
@ Sr @anPopić मैं इस उत्तर को पोस्ट करता हूं क्योंकि यह सरल और चरणबद्ध है।
विवेक

3

मैंने परीक्षण किया (लेकिन यह आपका उदाहरण नहीं है) और डेटा उन्हें क्रमबद्ध या पूर्ण नहीं लौटाता है

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = {x.replace('p','') for x in ind}
>>> newind
{'1', '2', '8', '5', '4'}

मैंने साबित किया कि यह काम करता है:

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = [x.replace('p','') for x in ind]
>>> newind
['5', '1', '8', '4', '2', '8']

या

>>> newind = []
>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> for x in ind:
...     newind.append(x.replace('p',''))
>>> newind
['5', '1', '8', '4', '2', '8']

3

जब हटाने के लिए कई सबस्ट्रिंग होते हैं, तो एक सरल और प्रभावी विकल्प re.subएक संकलित पैटर्न के साथ उपयोग करना होता है जिसमें रेगेक्स OR ( |) पाइप का उपयोग करके सभी सब्सट्रिंग-टू-रिमूवल शामिल होता है ।

import re

to_remove = ['.good', '.bad']
strings = ['Apple.good','Orange.good','Pear.bad']

p = re.compile('|'.join(map(re.escape, to_remove))) # escape to handle metachars
[p.sub('', s) for s in strings]
# ['Apple', 'Orange', 'Pear']

1

अगर सूची

मैं एक सूची के लिए कुछ कर रहा था जो स्ट्रिंग्स का एक सेट है और आप उन सभी लाइनों को हटाना चाहते हैं जिनके पास एक निश्चित विकल्प है जो आप यह कर सकते हैं

import re
def RemoveInList(sub,LinSplitUnOr):
    indices = [i for i, x in enumerate(LinSplitUnOr) if re.search(sub, x)]
    A = [i for j, i in enumerate(LinSplitUnOr) if j not in indices]
    return A

जहां subएक संरक्षक है कि आप लाइनों की एक सूची में नहीं करना चाहते हैंLinSplitUnOr

उदाहरण के लिए

A=['Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad']
sub = 'good'
A=RemoveInList(sub,A)

तब Aहोगा

यहाँ छवि विवरण दर्ज करें


0

यदि आप सूची से कुछ हटाते हैं, तो आप इस तरह से उपयोग कर सकते हैं: (विधि उप केस संवेदी है)

new_list = []
old_list= ["ABCDEFG","HKLMNOP","QRSTUV"]

for data in old_list:
     new_list.append(re.sub("AB|M|TV", " ", data))

print(new_list) // output : [' CDEFG', 'HKL NOP', 'QRSTUV']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.