পাইথনের স্ট্রিংগুলির সেট থেকে নির্দিষ্ট সাবস্ট্রিংগুলি কীভাবে সরিয়ে নেওয়া যায়?


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)পরিবর্তে ব্যবহার করার চেষ্টা করেছি কিন্তু এতে কোনও পরিবর্তন হয় না।

উত্তর:


186

স্ট্রিংগুলি অপরিবর্তনীয়। string.replace(পাইথন 2.x) বা str.replace(পাইথন 3.x) একটি নতুন স্ট্রিং তৈরি করে । এটি ডকুমেন্টেশনে বলা হয়েছে:

নতুন দ্বারা প্রতিস্থাপিত পুরানো স্ট্রিংয়ের সমস্ত উপস্থিতি সহ স্ট্রিংয়ের একটি অনুলিপি ফেরান। ...

এর অর্থ আপনাকে সেটটি পুনরায় বরাদ্দ করতে হবে বা এটি পুনর্বাসিত করতে হবে ( সেটটি বোঝার সাথে পুনরায় বরাদ্দকরণ সহজ ) :

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

3
string.replace()অজগর 3.x এ অবমূল্যায়ন করা হয়েছে, এখন এটিstr.replace()
ইয়াসিয়েরিয়ান 42

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

.replaceস্ট্রিং পরিবর্তন করে না , এটি প্রতিস্থাপনের সাথে স্ট্রিংয়ের একটি অনুলিপি দেয়। স্ট্রিং অপরিবর্তনীয় বলে আপনি সরাসরি স্ট্রিং পরিবর্তন করতে পারবেন না।

আপনাকে রিটার্নের মানগুলি নেওয়া উচিত x.replaceএবং এগুলি একটি নতুন সেটে স্থাপন করতে হবে।


তবে আমি যখন স্ট্রিংয়ের সেটটি লুপ করব, আমি কীভাবে একটি নতুন সেট আপডেট করতে পারি? set_name.update ব্যবহার করছেন? তুমি কি তা দেখাতে পার?
16'9

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đan Popić

@ শ্রীয়ানপপিও হ্যাঁ আমি আপনার সাথে একমত
বিবেক

আমাদের কি সেই অনুযায়ী সম্পাদনা করা উচিত? ( replaceগুলি মুছে ফেলুন এবং সমস্ত কিছুকে একটি re.subকলের দিকে নিয়ে যান )
শ্রিয়ান পোপিয়ে

1
@ স্রিয়ানপপিও আমি এই উত্তরটি পোস্ট করছি কারণ এটি সহজ এবং ধাপে বুদ্ধিমান।
বিবেক

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একটি সংকলিত প্যাটার্ন ব্যবহার করা হয় যা রেজেক্স ওআর ( |) পাইপ ব্যবহার করে সমস্ত সাবস্ট্রিং-টু-রিমুভালকে যুক্ত করে ।

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']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.