Python kullanarak bir karakter dizeden nasıl silinir


458

Örneğin, bir dize var. EXAMPLE.

Orta karakteri nasıl kaldırabilirim, yani M? Koda ihtiyacım yok. Bilmek istiyorum:

  • Python'daki dizeler herhangi bir özel karakterle bitiyor mu?
  • Hangisi daha iyi bir yoldur - her şeyi orta karakterden başlayarak sağa sola kaydırmak VEYA yeni bir dize oluşturmak ve orta karakteri kopyalamak değil mi?

Yanıtlar:


639

Python'da, dizeler değiştirilemez, bu nedenle yeni bir dize oluşturmanız gerekir. Yeni dizeyi oluşturma konusunda birkaç seçeneğiniz vardır. 'M'yi göründüğü her yerden kaldırmak istiyorsanız:

newstr = oldstr.replace("M", "")

Merkezi karakteri kaldırmak istiyorsanız:

midlen = len(oldstr)/2   # //2 in python 3
newstr = oldstr[:midlen] + oldstr[midlen+1:]

Dizelerin özel bir karakterle bitip bitmediğini sordunuz. Hayır, bir C programcısı gibi düşünüyorsun. Python'da, dizeler uzunluklarıyla birlikte depolanır, böylece dahil herhangi bir bayt değeri \0bir dizede görünebilir.


16
Sorucunun python için yepyeni olduğu göz önüne alındığında, 2.X python sürümünde "/" operatörünün bir tamsayı (sıfıra doğru kesilmiş) döndürdüğü, 3.X python sürümünde "//" kullanılması gerektiğini belirtmek gerekir. yerine. Ayrıca, from __future__ import divisionkomut dosyanızın başındaki satır sürüm 2.X python sürüm 3.X gibi davranır
Michael Dunn

1
"M" satırın tek içeriği ise, "" yerine boş bir satırın arkasında kaldığını unutmayın.
8bitjunkie

1
@ 7SpecialGems tamamen bu dizeyle ne yaptığınıza bağlıdır. Gibi boş bir dize "", boş bir satır anlamına gelmez. Bir listeye koyarsanız ve yeni satırlarla birleştirirseniz, boş bir satır oluşturur, ancak bunu yapmayacak boş bir dize kullanabileceğiniz birçok yer vardır.
Ned Batchelder

68

Bu muhtemelen en iyi yoldur:

original = "EXAMPLE"
removed = original.replace("M", "")

Karakterleri değiştirmek gibi konularda endişelenmeyin. Çoğu Python kodu çok daha yüksek bir soyutlama seviyesinde gerçekleşir.


6
Mbenzersiz olmayabilir. Bu durumda, bu tüm Ms yerini alacak , değil mi?
Lazer

14
Evet doğru. Yalnızca nolayları değiştirmek istiyorsanız kullanın original.replace("M", "", n).
özyinelemeli

1
@ S.Lott Sadece tek bir örneği değiştirmek için çözüm sunmayı önermek için retorik olarak aldım
Dodgie

63

Belirli bir konumu değiştirmek için:

s = s[:pos] + s[(pos+1):]

Belirli bir karakteri değiştirmek için:

s = s.replace('M','')

18
Bu işe yarayabilir olsa da, alt bölümde neler olduğunu açıklayarak cevabınızın iyileştirilebileceğini düşünüyorum, çünkü alt dize işlemlerinin herhangi bir açıklama yapmadan bir Python newbie için anlaşılması kolay değildir.
jloubert

Yani eğer s uzunluğu ise l. Daha sonra ilk bölüm için pos kısıtlaması olmalıdır l-1 > pos >= 0.
Haoyu Chen

s [: pos] alt dizeyi 0'dan pos-1'e alır ve s [(pos + 1):] alt dizeyi pos + 1'den sona alır. Bu nedenle, s'yi [s] s'den kaldırır.
s.singh

onun yerini almıyor, düşüyor. konum seçim yöntemiyle birbirinden ayrılan iki büyük kullanım durumu için örnekler sağlayarak işlemi ayırt etmek iyidir.
Alexander Stohr

28

Teller değişmez. Ancak bunları değiştirilebilir bir listeye dönüştürebilir ve değiştirdikten sonra listeyi bir dizeye dönüştürebilirsiniz.

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

Mevcut dizeden istediğiniz karakter dışında her şeyi alarak diğerlerinin de gösterdiği gibi yeni bir dize oluşturabilirsiniz .


4
Neden sadece str.replaceyöntemi kullanmıyorsunuz ?
alichaudry

12

Orta karakteri, yani M'yi ondan nasıl kaldırabilirim?

Yapamazsınız , çünkü Python'daki dizeler değişmezdir .

Python'daki dizeler herhangi bir özel karakterle bitiyor mu?

Hayır. Karakter listelerine benzerler; listenin uzunluğu dizenin uzunluğunu tanımlar ve hiçbir karakter sonlandırıcı işlevi görmez.

Hangisi daha iyi bir yoldur - her şeyi orta karakterden başlayarak sağa sola kaydırmak VEYA yeni bir dize oluşturmak ve orta karakteri kopyalamak değil mi?

Varolan dizeyi değiştiremezsiniz, bu nedenle orta karakter dışında her şeyi içeren yeni bir dize oluşturmanız gerekir.


11

translate()Yöntemi kullanın :

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'

3
Yöntem değişti. : Python 3 belgelerine bakınız ) (çevirmek Bu boşluk ile farklı karakterler değiştirir ( Nonekaldır işin görünmemektedir):translate( str.maketrans("<>", " ") )
sap

1
Aslında, dokümanlar Python 3'te translate () ile farklı karakterleri kaldırmak için iki yol belirler: str.maketrans( "", "", "<>")vestr.maketrans( {"<":None,">":None })
işlemek

3
Yanıttaki kodun eşdeğeri python3'te bu oldu:'EXAMPLE'.translate({ord("M"): None})
yoniLavi

7

UserString.MutableString

Değişken yolu:

import UserString

s = UserString.MutableString("EXAMPLE")

>>> type(s)
<type 'str'>

# Delete 'M'
del s[3]

# Turn it for immutable:
s = str(s)

3
404 web sitesi ithalat yok
şey

6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

Dizeden bir karakter nasıl kaldırılır: Burada, bir dizede karakter olarak temsil edilen kart destesinin bulunduğu bir örnek bulunmaktadır. Bunlardan biri çizilir (dizede rastgele bir karakter seçen random.choice () işlevi için rasgele modülü içe aktar). Yeni bir dize olan cardsLeft, string parametresi tarafından verilen kalan kartları tutmak için oluşturulur, burada son parametre yalnızca bir "kartın" boş dize ile değiştirileceğini gösterir ...


6
def kill_char(string, n): # n = position of which character you want to remove
    begin = string[:n]    # from beginning to n (n not included)
    end = string[n+1:]    # n+1 through end of string
    return begin + end
print kill_char("EXAMPLE", 3)  # "M" removed

Bunu burada bir yerde gördüm .


4

İşte "M" dilimlemek için yaptım:

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]

2
Bu sadece bu özel dizeyi çalıştıracaktır ve genel bir çözüm değildir.
Andreas Bergström

3

Bir dizedeki karakterleri silmek / yoksaymak istiyorsanız ve örneğin bu dizeye sahipseniz,

"[11: L: 0]"

bir web API yanıtından veya CSV dosyası gibi bir şeyden, istekleri kullandığınızı varsayalım

import requests
udid = 123456
url = 'http://webservices.yourserver.com/action/id-' + udid
s = requests.Session()
s.verify = False
resp = s.get(url, stream=True)
content = resp.content

döngü ve istenmeyen karakterlerden kurtulun:

for line in resp.iter_lines():
  line = line.replace("[", "")
  line = line.replace("]", "")
  line = line.replace('"', "")

İsteğe bağlı bölme ve değerleri ayrı ayrı okuyabileceksiniz:

listofvalues = line.split(':')

Artık her bir değere erişmek daha kolay:

print listofvalues[0]
print listofvalues[1]
print listofvalues[2]

Bu yazdırılacak

11

L

0


3

Bir charveya bir sub-string kez silmek için (yalnızca ilk tekrarlama):

main_string = main_string.replace(sub_str, replace_with, 1)

NOT: Burada 1, değiştirmek intistediğiniz olay sayısı için herhangi biriyle değiştirilebilir.


3

Sadece liste kavrayışını kullanabilirsiniz.

: Dizesinin olduğunu my name isve karakteri kaldırmak istediğinizi varsayalım m. aşağıdaki kodu kullanın:

"".join([x for x in "my name is" if x is not 'm'])

0
from random import randint


def shuffle_word(word):
    newWord=""
    for i in range(0,len(word)):
        pos=randint(0,len(word)-1)
        newWord += word[pos]
        word = word[:pos]+word[pos+1:]
    return newWord

word = "Sarajevo"
print(shuffle_word(word))

2
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
andreas

0

Başka bir yol, bir işlev ile,

Aşağıda, yalnızca işlevi çağırarak bir dizeden tüm sesli harfleri kaldırmanın bir yoludur.

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")

-7

Dizeler Python'da değişmezdir, bu nedenle her iki seçeneğiniz de temelde aynı anlama gelir.

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.