Python'da bir dizeden belirli alt dizeleri nasıl kaldırırım?


160

Dizeleri bir dizi var set1ve tüm dizeleri set1gerek ve kaldırmak istediğiniz iki belirli alt dizeleri var.
Örnek Giriş: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Temelde .goodve .baddizelerin tüm dizelerden kaldırılmasını istiyorum .
Ne denedim:

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

Ama bu işe yaramıyor gibi görünüyor. Çıkışta kesinlikle bir değişiklik yoktur ve girişle aynıdır. for x in list(set1)Orijinal olanın yerine kullanmayı denedim ama bu hiçbir şeyi değiştirmiyor.

Yanıtlar:


187

Teller değişmez. string.replace(python 2.x) veya str.replace(python 3.x) yeni bir dize oluşturur . Bu belgelerde belirtilmiştir:

Tüm eski dize oluşumları yeni ile değiştirilen dizelerin s kopyasını döndürür . ...

Bu, seti yeniden tahsis etmeniz veya yeniden doldurmanız gerektiği anlamına gelir ( set kavrama ile yeniden tahsis daha kolaydır ) :

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

3
string.replace()python 3.x'te kullanımdan kaldırıldı, şimdistr.replace()
Yossarian42

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

.replacevermez değiştirmek dize, bu değiştirme ile dizinin bir kopyasını döndürür. Dizeleri değiştirilemez olduğu için dizeyi doğrudan değiştiremezsiniz.

Dönüş değerlerini almanız ve x.replaceyeni bir kümeye koymanız gerekir.


Ancak dizeler dizisi üzerinde döngü yaptığımda, yeni bir diziyi nasıl güncelleyebilirim? set_name.update mi kullanıyorsunuz? Bunu gösterebilir misin?
controlfreak

12

Tek ihtiyacınız olan biraz kara büyü!

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

5

Bunu yapabilirsin:

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
Satır x.replace('.good',' ')ve x.replace('.bad',' ')nihai sonuca şey yapmaz. Çıktı onlarsız aynı olacaktır.
Srđan Popić

Ayrıca, bunun gibi sadece bir satır olmasını tercih ederim re.sub:x = re.sub('((\.good$)|(\.bad$))', '', x)
Srđan Popić

@ SrđanPopić evet sana katılıyorum
Vivek

uygun şekilde düzenlemeli miyiz? ( replaces'yi kaldırın ve her şeyi bir re.subçağrıya taşıyın )
Srđan Popić

1
@ SrđanPopić Bu cevabı gönderiyorum çünkü basit ve adım adım akıllıca.
Vivek

3

Testi yaptım (ancak örnek değil) ve veriler bunları düzenli veya eksiksiz döndürmüyor

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

Bunun işe yaradığını kanıtladım:

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

veya

>>> 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

Kaldırılacak birden çok alt dize olduğunda, basit ve etkili bir seçenek, re.subregex OR ( |) borusu kullanılarak kaldırılacak tüm alt dizelerin birleştirilmesini içeren derlenmiş bir desenle kullanmaktır .

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

Eğer liste

Dizeler kümesi olan bir liste için bir şeyler yapıyordum ve bunu yapabileceğiniz belirli bir alt dize olan tüm satırları kaldırmak istiyorsunuz

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

subsatır listesinde olmasını istemediğiniz bir bilmece neredeLinSplitUnOr

Örneğin

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

O Azaman olacak

resim açıklamasını buraya girin


0

listeden bir şey silerseniz, u şu şekilde kullanabilirsiniz: (method sub büyük / küçük harfe duyarlıdır)

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']
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.