Pytanie Czy istnieje sposób na podciąganie łańcucha znaków w Pythonie?


Czy istnieje sposób na podciąganie łańcucha znaków w Pythonie, aby uzyskać nowy ciąg od trzeciej litery do końca łańcucha?

Może jak myString[2:end]?

Jeśli opuszczenie drugiej części oznacza "do końca", jeśli opuścisz pierwszą część, czy zaczyna się od początku?


1595
2018-03-19 17:29


pochodzenie


Ta zawiera jasne wyjaśnienie pythoncentral.io/cutting-and-slicing-strings-in-python - Mario Ruiz


Odpowiedzi:


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

Python nazywa to pojęcie "krojeniem" i działa na więcej niż tylko łańcuchach. Spójrz tutaj do kompleksowego wprowadzenia.


2417
2018-03-19 17:30





Tylko dla kompletności, o czym nikt inny nie wspomniał. Trzeci parametr do wycinka macierzy jest krokiem. Zatem odwrócenie ciągu znaków jest tak proste, jak:

some_string[::-1]

Lub wybierając alternatywne znaki będzie:

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

Zdolność do przechodzenia do przodu i do tyłu przez ciąg utrzymuje spójność z możliwością odseparowania wycinka od początku lub końca.


305
2018-03-20 00:58



@mtahmed absolutnie związany z pytaniem. Co jeśli chcesz podciąć wybierając inne znaki z ciągu? To byłoby my_string [:: 2] - Endophage
Myślę, że jest bardziej prawdopodobne, że chciałbyś wspomnieć o trzecim parametrze do wycinania. Konieczność zdobycia każdej innej postaci z ciągu może być ważnym przypadkiem użycia, ale nigdy nie musiałem tego robić. Nie chodzi o to, że jest coś złego w chęci pochwalenia się tym, co wiesz - jaki jest cel poznawania rzeczy, jeśli nie możesz tego zrobić. :) Ale argument dotyczący trafności tego pytania jest zawyżony. - John Lockwood
Oczywiście, konkretny przykład wyboru alternatywnych znaków może nie mieć znaczenia dla pytania, ale zrozumienie trzeciego parametru jest bardzo ważne, a proste przykłady ilustrują jego działanie. Społeczność Pythona ma także wspaniałą historię edukowania nowych członków w przyjazny sposób :-) - Endophage


Zwykle Substr () (np. PHP i Perl) działa w następujący sposób:

s = Substr(s, beginning, LENGTH)

A więc parametry są beginning i LENGTH.

Ale zachowanie Pythona jest inne; oczekuje początku i jeden po END (!). Jest to trudne do zauważenia przez początkujących. Zatem właściwym zamiennikiem dla Substr (s, początku, DŁUGOŚCI) jest

s = s[ beginning : beginning + LENGTH]

92
2017-08-04 11:43



Początkujący powinni nauczyć się pytonicznej drogi, przechodząc do Pythona, a nie trzymać się nawyków językowych - Nicolae Surdu


Typowym sposobem na osiągnięcie tego jest cięcie łańcuchowe. MyString[a:b] daje podciąg od indeksu od a do (b - 1)


45
2018-03-02 05:19



proste i łatwe. dzięki - Jacky Supit


Jeden przykład wydaje się tu brakować: pełna (płytka) kopia.

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

Jest to popularny język do tworzenia kopii typów sekwencji (nie internowanych łańcuchów). [:] Płytkie kopie listę, patrz Python-list-slice-used-for-no-obviousride-reason.


17
2018-03-19 18:02



Nie ma to prawie nic wspólnego z pytaniem o podciąg. Nie dotyczy nawet napisu. Wymówienie stringA = stringB wystarczy ... - Nicolae Surdu
Pełna kopia [:] tworzy NOWY KOPIUJ, używa składni segmentów i jest odczytywana jako "podłańcuch od początku do końca" - gimel
Jaki jest sens, ponieważ ciągi są niezmienne? a=b powinno być wystarczające. - bfontaine
@gimel: Właściwie, [:] na niezmiennym typie wcale nie tworzy kopii. Podczas mysequence[:] jest w większości nieszkodliwy, kiedy mysequence jest niezmiennym typem str, tuple, bytes (Py3) lub unicode (Py2), a = b[:] jest równa a = b, to po prostu marnuje trochę czasu na wysyłanie kodów podziału bajtów, na które reaguje obiekt, zwracając się, ponieważ nie ma sensu do płytkiego kopiowania, gdy poza testami identyczności obiektów, jest to równoznaczne z powrotem do innego odniesienia do niezmiennego siebie. - ShadowRanger
Próba podsumowania innych uwag krytycznych dotyczących tej odpowiedzi: w Pythonie ciągi są niezmienne, dlatego nie ma powodu, aby tworzyć ciąg znaków - tak s[:] w ogóle nie tworzy kopii: s = 'abc'; s0 = s[:]; assert s is s0. Tak, to był idiomatyczny sposób na kopiowanie listy w Pythonie, dopóki nie pojawią się listy list.copy, ale pełny kawałek niezmiennego typu nie ma powodu do wykonania kopii, ponieważ nie można go zmienić, więc równie dobrze może być tylko jedna w pamięci i nie powinniśmy marnować czasu na jej kopiowanie. Ponieważ ta odpowiedź jest błędna i nawet nie odpowiada na pytanie- czy należy go usunąć? - Aaron Hall♦


Czy istnieje sposób na podciąganie łańcucha znaków w Pythonie, aby uzyskać nowy ciąg od trzeciej litery do końca łańcucha?

Może jak myString[2:end]?

Tak, to faktycznie działa, jeśli przypisujesz, lub wiązać, imię,enddo stałego singletonu, None:

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

Notacja plasterkowa ma 3 ważne argumenty:

  • początek
  • zatrzymać
  • krok

Ich wartości domyślne, gdy nie są podane, są None - ale możemy przekazać je jawnie:

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

Jeśli opuszczenie drugiej części oznacza "do końca", jeśli opuścisz pierwszą część, czy zaczyna się od początku?

Tak, na przykład:

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

Zwróć uwagę, że uwzględniamy początek w wycinku, ale podchodzimy do, a nie włączając, zatrzymujemy się.

Kiedy krok jest None, domyślnie używa plastra 1 za krok. Jeśli wybierzesz ujemną liczbę całkowitą, Python będzie wystarczająco inteligentny, aby przejść od końca do początku.

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

Dokładnie objaśniam notację plasterka w moja odpowiedź do wyjaśnienia oznaczenia plastra Pytanie. 


13
2018-06-23 21:53





Masz go tam, z wyjątkiem "końca". To się nazywa notacja plastra. Twój przykład powinien brzmieć:

new_sub_string = myString[2:]

Jeśli pominiesz drugi parametr, będzie to nieodwracalnie koniec łańcucha.


7
2018-03-19 17:31





Chciałbym dodać dwa punkty do dyskusji:

  1. Możesz użyć None zamiast tego na pustym polu, aby określić "od początku" lub "do końca":

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

    Jest to szczególnie przydatne w funkcjach, w których nie można podać pustego miejsca jako argumentu:

    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 ma kawałek obiekty:

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

6
2017-08-31 04:28





Może tęskniłem za tym, ale nie mogłem znaleźć pełnej odpowiedzi na tej stronie na oryginalne pytanie (pytania), ponieważ zmienne nie są tu dalej omawiane. Więc musiałem szukać dalej.

Ponieważ nie mogę jeszcze komentować, pozwólcie, że dodam tutaj swój wniosek. Jestem pewien, że nie byłam jedyną osobą, która się nim interesuje, gdy wchodzę na tę stronę:

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

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

Jeśli opuścisz pierwszą część, otrzymasz

 >>>myString[:end]
 'Hello' 

A jeśli opuściłeś: w środku również masz najprostszy podciąg, który byłby piątą literą (licząc od 0, więc w tym przypadku jest pusta):

 >>>myString[end]
 ' '

2
2018-03-18 12:01





Korzystanie z indeksów zakodowanych samemu może być bałaganem.

Aby tego uniknąć, Python oferuje wbudowany obiekt slice().

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

Jeśli chcemy wiedzieć, ile pieniędzy mi zostało.

Normalne rozwiązanie:

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

Używanie plasterków:

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

Za pomocą plasterka zyskujesz czytelność.


0
2017-08-31 04:50



Być może nie jest to najlepszy przykład, ponieważ indeksy zakodowane na sztywno pozostają, a czytelność pochodzi od zmiennych pośrednich, które mogłeś wykorzystać w pierwszym przykładzie. - ASalazar