Soru Python'da bir dizeyi dizmek için bir yol var mı?


3. karakterden dizenin sonuna kadar yeni bir dize almak için Python'da bir dizeyi dizmek için bir yol var mı?

Belki gibi myString[2:end]?

Eğer ikinci kısımdan ayrılmak, 'sonuna kadar' anlamına gelirse, ilk kısımdan ayrılırsanız, başlangıçtan başlıyor mu?


1595
2018-03-19 17:29


Menşei


Bu açık bir açıklama içeriyor pythoncentral.io/cutting-and-slicing-strings-in-python - Mario Ruiz


Cevaplar:


>>> 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ır ve sadece dizelerden daha fazlası üzerinde çalışır. Bir göz at İşte kapsamlı bir giriş için.


2417
2018-03-19 17:30





Sadece kimsenin bahsetmediği gibi tamlık için. Bir dizi dilimine üçüncü parametre bir adımdır. Yani bir dizgeyi tersine çevirmek şu kadar basit:

some_string[::-1]

Veya alternatif karakterler seçmek şöyle olurdu:

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

Dize boyunca ileriye ve geriye adımlama yeteneği, başlangıçtan veya sondan dilim dizilebilme ile tutarlılığı korur.


305
2018-03-20 00:58



@mtahmed kesinlikle soruyla ilgili. Dizgeden alternatif karakterler seçerek alt dizgi yapmak isterseniz? Bu benim_string olurdu [:: 2] - Endophage
Dilimlemek için üçüncü parametreden bahsetmek daha olası olduğunu düşünüyorum. Bir dizeden diğer her karakteri almam gerektiğinde, bir yerlerde önemli bir kullanım durumu olabilir, ama asla bunu yapmak zorunda kalmamıştım. Bilmediğiniz şeyleri göstermek istediğinizde yanlış bir şey yok - bunu yapamayacağınız şeyleri bilmenin anlamı nedir? :) Ancak, konuyla ilgisi olan durum abartılı. - John Lockwood
Elbette, alternatif karakterleri seçmenin kendine özgü örneği, bu soruyla ilgili olmayabilir, ancak anlamak, çok fazla dilimlemenin 3 boyutlu bir parametresi olduğunu ve basit örneklerin nasıl çalıştığını göstermeye hizmet ettiğini görüyoruz. Python topluluğu da yeni üyeleri dostça bir şekilde eğitmek için harika bir tarihe sahiptir. - Endophage


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

s = Substr(s, beginning, LENGTH)

Yani parametreler beginning ve LENGTH.

Fakat Python'un davranışı farklıdır; başlangıcı ve bir sondan sonra bekler (!). Bu yeni başlayanlar tarafından tespit etmek zordur. Bu yüzden Substr (s, başlangıç, LENGTH) için doğru yer değiştirme

s = s[ beginning : beginning + LENGTH]

92
2017-08-04 11:43



Yeni başlayanlar python'a taşınırken pythonik yolu öğrenmeli, diğer dil alışkanlıklarına bağlı kalmamalıdırlar. - Nicolae Surdu


Bunu başarmanın yaygın bir yolu String dilimlemedir. MyString[a:b] a'dan a'ya (b - 1) bir alt yazı verir


45
2018-03-02 05:19



basit ve kolay. Teşekkürler - Jacky Supit


Bir örnek burada eksik gibi 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 kullanılan bir deyimdir (dahili dizelerden değil). [:] Sığ bir liste kopyalar piton listem dilimli-used-için-no-belirgin-nedenden.


17
2018-03-19 18:02



Bu, substring ile ilgili soru ile neredeyse hiçbir ilgisi yoktur. Dize için bile geçerli değil. StringA = stringB demek yeterli ... - Nicolae Surdu
[:] Tam kopya YENİ BİR KOPYA oluşturur, dilim sözdizimini kullanır ve "baştan sona alt dizgi" olarak okunur. - gimel
Dizeler değişmez olduğu için ne anlamı var? a=b yeterli olmalı. - bfontaine
@gimel: Aslında, [:] değişmez tipte hiç bir kopya oluşturmaz. Süre mysequence[:] ne zaman zararsız ise mysequence değişmez bir tip gibidir str, tuple, bytes (Py3) veya unicode (Py2), a = b[:] eşdeğerdir a = bNesne kimlik testlerinin yanı sıra, bir başkasının değişmez benliğine başka bir referans vermenin eşdeğeri olduğu zaman, sığ kopyalamanın anlamsız olduğu için, nesnenin kendisine geri dönerek cevap verdiği dilimleme bayt kodlarını göndermek için sadece biraz zaman harcıyor. - ShadowRanger
Bu cevabın diğer eleştirilerini özetlemeye çalışmak: Python'da dizeler değişmez, bu nedenle bir dizenin kopyasını çıkarmak için bir sebep yok - s[:] hiç kopyalama yapmıyor: s = 'abc'; s0 = s[:]; assert s is s0. Evet, listeler alıncaya kadar Python'da bir listeyi kopyalamanın deyimsel yolu buydu list.copyama değişmez bir türden bir tam dilim, kopyalanamaz çünkü kopyalanamaz çünkü bu yüzden de sadece bir tane bellek olabilir ve bunu kopyalamak için zaman kaybetmemeliyiz. Bu cevap yanlış olduğu ve soruyu bile cevaplama - silinmeli mi? - Aaron Hall♦


3. karakterden dizenin sonuna kadar yeni bir dize almak için Python'da bir dizeyi dizmek için bir yol var mı?

Belki gibi myString[2:end]?

Evet, bu aslında atarsanız veya bağlamak, isim,end, sabit tektona, None:

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

Dilim notasyonu 3 önemli argümana sahiptir:

  • başla
  • durdurmak
  • adım

Verilmediklerinde varsayılanları None - ama onları açıkça geçirebiliriz:

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

Eğer ikinci kısımdan ayrılmak, 'sonuna kadar' anlamına gelirse, ilk kısımdan ayrılırsanız, başlangıçtan başlıyor mu?

Evet, örneğin:

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

Dilime başladığımızı unutmayın, ancak sadece durup, dahil etmeyiz, dururuz.

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

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

Dilim notasyonunu ayrıntılı olarak açıklarım. Dilim notasının Açıklamasını Anlatan Soru. 


13
2018-06-23 21:53





"Son" hariç, tam oradasın. Buna dilim notasyonu denir. Örneğiniz şunu okumalı:

new_sub_string = myString[2:]

Eğer ikinci parametreyi bırakırsanız, dolaylı olarak dizenin sonu olur.


7
2018-03-19 17:31





Tartışmaya iki nokta eklemek istiyorum:

  1. Kullanabilirsiniz None yerine "başlangıçtan" ​​veya "sonuna" belirtmek için boş bir alana:

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

    Bu, özellikle argüman olarak boş alan sağlayamayacağınız işlevlerde 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 var dilim nesneler:

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

6
2017-08-31 04:28