Czy istnieje sposób na podciąganie łańcucha w Pythonie, aby uzyskać nowy ciąg od trzeciego znaku do końca ciągu?
Może jak myString[2:end]
?
Jeśli opuszczenie drugiej części oznacza „do końca”, a jeśli opuścisz pierwszą część, to czy zacznie się od początku?
Odpowiedzi:
Python nazywa tę koncepcję „krojeniem” i działa na więcej niż tylko łańcuchach. Spójrz tutaj kompleksowego wprowadzenia.
źródło
Tylko dla kompletności, jak nikt inny o tym nie wspomniał. Trzecim parametrem wycinka tablicy jest krok. Tak więc odwrócenie łańcucha jest tak proste jak:
Lub wybór alternatywnych znaków to:
Możliwość przechodzenia do przodu i do tyłu przez ciąg zachowuje spójność z możliwością ustawiania wycinka od początku lub końca.
źródło
Substr () normalnie (tj. PHP i Perl) działa w ten sposób:
Więc parametry to
beginning
iLENGTH
.Ale zachowanie Pythona jest inne; oczekuje początku i jednego po END (!). Jest to trudne do zauważenia przez początkujących. Tak więc poprawnym zamiennikiem dla Substr (s, begin, LENGTH) jest
źródło
s[beginning:][:length]
Częstym sposobem na osiągnięcie tego jest krojenie sznurka.
MyString[a:b]
daje ci podciąg od indeksu od a do (b - 1).źródło
Wydaje się, że brakuje tutaj jednego przykładu: pełna (płytka) kopia.
Jest to wspólny idiom do tworzenia kopii typów sekwencyjnych (nie z internowanych strun)
[:]
. Płytkie kopie listy, zobacz Składnia wycinka listy Python używana bez wyraźnego powodu .źródło
a=b
powinno wystarczyć.[:]
na niezmiennym typie wcale nie robi się kopii. Choćmysequence[:]
jest przeważnie nieszkodliwe, gdymysequence
jest niezmienna typu jakstr
,tuple
,bytes
(Py3) lubunicode
(Py2)a = b[:]
jest równoważnea = b
, to po prostu traci trochę czasu wysyłki krojenie kodów bajtowych którym reaguje obiektów do wracając się, ponieważ jest to bezcelowe płytkiej kopii gdy , oprócz testów tożsamości obiektu, jest to równoważne po prostu zwrócenie kolejnego odniesienia do niezmiennego ja.s[:]
nie zrobić kopię na wszystko:s = 'abc'; s0 = s[:]; assert s is s0
. Tak, to był idiomatyczny sposób kopiowania listy w Pythonie, dopóki listy sięlist.copy
nie pojawią, ale pełny kawałek niezmiennego typu nie ma powodu, aby kopiować, ponieważ nie można go zmienić, więc może być tylko jedna pamięć i nie powinniśmy tracić czasu na kopiowanie. Ponieważ ta odpowiedź jest błędna i nawet nie odpowiada na pytanie - czy należy ją usunąć?Tak, to faktycznie działa, jeśli przypisujesz lub wiążesz nazwę
end
, do stałego singletonuNone
:Notacja wycinka zawiera 3 ważne argumenty:
Ich wartości domyślne, gdy nie są podane, to
None
- ale możemy je przekazać jawnie:Tak, na przykład:
Zauważ, że uwzględniamy start w wycinku, ale wchodzimy tylko do zatrzymania, ale nie wyłączamy go.
Gdy krok jest
None
, domyślnie plasterek używa1
kroku. Jeśli zrobisz krok z ujemną liczbą całkowitą, Python jest wystarczająco inteligentny, aby przejść od końca do początku.Objaśniam notację plastra bardzo szczegółowo w mojej odpowiedzi na wyjaśnienie notacji plastra Pytanie.
źródło
Masz to tutaj, z wyjątkiem „końca”. To się nazywa notacja plastra. Twój przykład powinien brzmieć:
Jeśli pominiesz drugi parametr, będzie to domyślnie koniec łańcucha.
źródło
Chciałbym dodać do dyskusji dwa punkty:
Zamiast tego możesz użyć
None
pustego miejsca, aby określić „od początku” lub „do końca”:Jest to szczególnie przydatne w funkcjach, w których nie można podać pustej przestrzeni jako argumentu:
Python ma obiekty plasterków :
źródło
Jeśli myString zawiera numer konta, który zaczyna się na przesunięcie 6 i ma długość 9, a następnie można wyodrębnić numer konta w ten sposób:
acct = myString[6:][:9]
.Jeśli PO zaakceptuje to, mogą chcieć spróbować, eksperymentalnie,
Działa - nie pojawia się żaden błąd i nie występuje domyślne „dopełnianie łańcucha”.
źródło
myString[offset:][:length]
w przypadku OP, możesz po prostu użyćmyString[offset:][:]
Może mi tego brakowało, ale nie mogłem znaleźć pełnej odpowiedzi na tej stronie na pierwotne pytanie, ponieważ zmienne nie są tutaj omawiane dalej. Musiałem więc dalej szukać.
Ponieważ nie mogę jeszcze komentować, dodam tutaj moją konkluzję. Jestem pewien, że nie byłem tym zainteresowany, gdy wchodziłem na tę stronę:
Jeśli opuścisz pierwszą część, dostaniesz
A jeśli zostawiłeś: w środku również masz najprostszy podłańcuch, którym byłby piąty znak (policz od 0, więc w tym przypadku jest pusty):
źródło
Cóż, dostałem sytuację, w której musiałem przetłumaczyć skrypt PHP na Python i miał wiele zastosowań
substr(string, beginning, LENGTH)
.Gdybym wybrał Pythona,
string[beginning:end]
musiałbym obliczyć wiele indeksów końcowych, więc łatwiejszym sposobem było użyciestring[beginning:][:length]
, to zaoszczędziło mi wielu kłopotów.źródło
Korzystanie z samych indeksów na stałe może być bałaganem.
Aby tego uniknąć, Python oferuje wbudowany obiekt
slice()
.Jeśli chcemy wiedzieć, ile pieniędzy mi zostało.
Normalne rozwiązanie:
Używanie plasterków:
Używając wycinka zyskujesz czytelność.
źródło