Python'da bir dizenin alt dizesini nasıl alabilirim?


Yanıtlar:


3178
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python bu kavramı "dilimleme" olarak adlandırıyor ve sadece dizelerden daha fazlası üzerinde çalışıyor. Kapsamlı bir tanıtım için buraya bir göz atın .


401

Başka hiç kimse bahsetmediği gibi tamlık için. Dizi diliminin üçüncü parametresi bir adımdır. Yani bir dizeyi tersine çevirmek şu kadar basittir:

some_string[::-1]

Veya alternatif karakterler seçmek:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

Dize boyunca ileri ve geri adım atma becerisi, dilimi başlangıçtan veya bitişten dizileyebilme ile tutarlılığı korur.


21
mtahmed kesinlikle soru ile ilgili. Dizeden alternatif karakterler seçerek alt dize yapmak isterseniz ne olur? Bu my_string [:: 2]
Endophage

Bence dilim için üçüncü parametreden bahsetmek daha olasıdır. Bir dizeden diğer tüm karakterleri almak bir yerde önemli bir kullanım durumu olabilir, ama bunu hiç yapmak zorunda kalmadım. Bildiklerinizi göstermek istemeniz yanlış bir şey değil - bunu yapamazsanız bir şeyleri bilmenin anlamı nedir. :) Ancak soruya uygunluk durumu abartılıdır.
John Lockwood

1
Elbette, alternatif karakterler seçmenin spesifik örneği soru ile ilgili olmayabilir, ancak çok dilimlemenin 3. parametresinin olduğunu anlamak önemlidir ve basit örnekler nasıl çalıştığını göstermeye yarar. Python topluluğu ayrıca yeni üyeleri dostça bir şekilde eğitme konusunda harika bir geçmişe sahiptir :-)
Endophage

127

Substr () normalde (yani PHP ve Perl) şu şekilde çalışır:

s = Substr(s, beginning, LENGTH)

Yani parametreler beginningve LENGTH.

Ancak Python'un davranışı farklıdır; END (!) 'dan başlamayı ve sonra bir tane bekler. Bu yeni başlayanlar tarafından tespit etmek zordur. Substr (s, başlangıç, LENGTH) için doğru değiştirme

s = s[ beginning : beginning + LENGTH]

76
Yeni başlayanlar, diğer dil alışkanlıklarına bağlı
kalmadan, pitona geçerken pitonik

3
Ve tamlık için Java, String.substring () yönteminin başlangıcı ve bir geçmişi bitirmesi bakımından Python gibidir. Bu beni biraz zorladı, dünyadaki diğer tüm alt dize fonksiyonları gibi uzunluğunu varsaymıştım.
PhilHibbs

4
Bunu yapmak için (muhtemelen) daha pythonic bir yols[beginning:][:length]
victortv

2
PHP gibi [kirli kelime] dilleri yerine Python ile başlayan biri olarak, bence Python dizesiyle [başlangıç: bitiş] çok daha basit ve sezgisel. Uzunluk genellikle ilgili değildir.
Gloweye

60

Bunu başarmanın yaygın bir yolu tel dilimlemedir.

MyString[a:b] size a'dan (b - 1) dizinine kadar bir alt dize verir.


23

Burada bir örnek eksik görünüyor: tam (sığ) kopya.

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>

Bu, dizi türlerinin bir kopyasını oluşturmak için yaygın bir deyimdir (iç içe dizelerin değil) [:],. Sığ bir listeyi kopyalar, açık bir sebep olmadan kullanılan Python listesi dilim sözdizimine bakın .


12
Bunun, alt dize ile ilgili soru ile hemen hemen hiçbir ilgisi yoktur. Dizeye bile uygulanmaz. StringA = stringB demek yeterlidir ...
Nicu Surdu

2
[:] Tam kopya YENİ bir KOPYA oluşturur, dilim sözdizimini kullanır ve "baştan sona alt dize" olarak okunur
gimel

2
Dizelerin değişmez olmasının nedeni nedir? a=byeterli olmalıdır.
bfontaine

1
@gimel: Aslında, [:]değişmez bir tipte hiç kopya oluşturmaz. İken mysequence[:]zaman çoğunlukla zararsızdır mysequencegibi değişmez bir türüdür str, tuple, bytes(PY3) ya da unicode(Py2), a = b[:]eşdeğer olduğunu a = b, sadece dilimleme bayt kodları sevk biraz zaman harcar hangi sığ kopya zaman için 's Pointless beri kendisini dönerek nesne, yanıt olarak nesne kimlik testlerinin yanı sıra, değişmez benliğine başka bir referans döndürmekle eşdeğerdir.
ShadowRanger

3
Bu cevabın diğer eleştiriler Özetle çalışılıyor: In Python, dizeleri nedenle bir dize bir kopyasını yapmak için hiçbir neden yoktur, iletmenin - bu yüzden s[:]hiç bir kopyasını yapmaz: s = 'abc'; s0 = s[:]; assert s is s0. Evet, listeler elde edilene kadar bir listeyi Python'da kopyalamanın deyimsel yoluydu list.copy, ancak değişmez tipte tam bir dilimin bir kopya yapmak için bir nedeni yoktur, çünkü değiştirilemez, bu yüzden bellekte sadece bir tane olabilir ve kopyalamak için zaman kaybetmemeliyiz. Bu cevap yanlış olduğundan ve soruyu bile yanıtlamadığından silinmelidir mi?
Aaron Hall

18

3. karakterden dizenin sonuna kadar yeni bir dizgi elde etmek için Python'da bir dizeyi alt dizmenin bir yolu var mı?

Belki gibi myString[2:end]?

Evet, bu aslında adı sürekli singleton'a atar veya bağlarsanız çalışır :endNone

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

Dilim gösteriminin 3 önemli argümanı vardır:

  • Başlat
  • Dur
  • adım

Verilmediklerinde varsayılanları None- ancak bunları açıkça iletebiliriz:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

İkinci kısımdan ayrılmak 'sonuna kadar' anlamına gelirse, ilk kısımdan ayrılırsanız, baştan başlar mı?

Evet, örneğin:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

Dilimde başlatmayı içerdiğimizi, ancak yalnızca durduğumuzu ve durduğumuzu unutmayın.

Adım olduğunda None, varsayılan olarak dilim 1adım için kullanır . Negatif bir tamsayı ile adım atarsanız, Python baştan sona kadar akıllıdır.

>>> myString[::-1]
'0987654321'

Dilim gösterimini açıkla Soruya cevabımda dilim gösterimini ayrıntılı olarak açıklıyorum .


8

Orada "son" dışında var. Buna dilim gösterimi denir. Örneğiniz şöyle olmalıdır:

new_sub_string = myString[2:]

İkinci parametreyi dışarıda bırakırsanız, dolaylı olarak dizenin sonu olur.


6

Tartışmaya iki nokta eklemek istiyorum:

  1. Bunun Noneyerine boş bir alanda "başlangıçtan" ​​veya "sondan" belirtmek için kullanabilirsiniz:

    'abcde'[2:None] == 'abcde'[2:] == 'cde'

    Bu, bağımsız değişken olarak boş bir alan sağlayamadığınız işlevlerde özellikle yararlıdır:

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
  2. Python'un dilim nesneleri vardır:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'

6

MyString 6 ofset başlar ve uzunluğu 9 olan bir hesap numarası içeriyorsa, o zaman hesap numarası bu şekilde çıkarabilir: acct = myString[6:][:9].

OP bunu kabul ederse, deneysel bir şekilde denemek isteyebilirler.

myString[2:][:999999]

Çalışır - hata oluşmaz ve varsayılan 'dize dolgusu' oluşmaz.


1
Bence myString[offset:][:length]OP durumunda bu yöntemi kullanmak istiyorsanız sadece kullanabilirsinizmyString[offset:][:]
victortv

1
@VictorVal Cevap, Python'u 2. (3., 4., ...) bir programlama dili olarak öğrenmiş ve dile yaklaşmak için bazı 'sözdizimi kancaları' almak isteyenler (benim gibi) içindir. Dildeki uzmanlar büyük olasılıkla cevabımı biraz aptalca görecekler.
CopyPasteIt

Bunun gibi cevaplar silinmek üzere işaretlenmeli mi? Diğer cevaplar benzer çözümü çok daha iyi açıklıyor ve bunu görmek, sadece bu tür bir cevap olduğunu fark etmeden önce birkaç dakika boyunca başımı ve arama python'umu çizmemi sağladı.
Sebi

3

Belki de kaçırdım, ancak değişkenler burada daha fazla tartışılmadığından, bu sayfada orijinal sorulara tam bir cevap bulamadım. Bu yüzden aramaya devam etmek zorunda kaldım.

Henüz yorum yapma iznim olmadığından sonucumu buraya ekleyeyim. Eminim bu sayfaya erişirken ilgilenen tek kişi ben değildim:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

İlk bölümü terk ederseniz,

 >>>myString[:end]
 'Hello' 

Ve: karakterini ortada bıraktıysanız, 5. karakter olacak en basit alt dizeye sahip olursunuz (0 ile başlayan sayım, bu nedenle bu durumda boştur):

 >>>myString[end]
 ' '

1

Python'a bir PHP betiği çevirmem gereken bir durum var ve bunun birçok kullanımı vardı substr(string, beginning, LENGTH).
Python'ları seçersem, çok sayıda endeks string[beginning:end]hesaplamalıydım , bu yüzden kullanmak daha kolay bir yol, bana çok fazla sorun kaydetti.string[beginning:][:length]


0

Sabit kodlu dizinleri kullanmak karışıklık yaratabilir.

Bundan kaçınmak için Python yerleşik bir nesne sunar slice().

string = "my company has 1000$ on profit, but I lost 500$ gambling."

Kaç para kaldığımı bilmek istiyorsak.

Normal çözüm:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

Dilimleri kullanma:

EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

Dilim kullanarak okunabilirlik kazanırsınız.


5
Belki de bu en iyi örnek değildir, çünkü sabit kodlanmış dizinler kalır ve okunabilirlik ilk örnekte kullanabileceğiniz ara değişkenlerden gelir.
ASalazar
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.