Potrzebuję dobrego wyjaśnienia (odniesienia są plusem) na notacji plastra Pythona.
Dla mnie ta notacja wymaga nieco poprawienia.
Wygląda niezwykle potężnie, ale nie do końca rozumiem.
To naprawdę bardzo proste:
a[start:stop] # items start through stop-1
a[start:] # items start through the rest of the array
a[:stop] # items from the beginning through stop-1
a[:] # a copy of the whole array
Istnieje również step
wartość, której można użyć z dowolnym z powyższych:
a[start:stop:step] # start through not past stop, by step
Kluczową kwestią do zapamiętania jest to, że :stop
wartość reprezentuje pierwszą wartość, która nie znajduje się w wybranym wycinku. Różnica między stop
i start
to liczba wybranych elementów (jeśli step
domyślnie jest to 1).
Drugą cechą jest to, że start
albo stop
może być ujemna liczba, co oznacza, że liczy się od końca tablicy zamiast początku. Więc:
a[-1] # last item in the array
a[-2:] # last two items in the array
a[:-2] # everything except the last two items
Podobnie step
może być liczbą ujemną:
a[::-1] # all items in the array, reversed
a[1::-1] # the first two items, reversed
a[:-3:-1] # the last two items, reversed
a[-3::-1] # everything except the last two items, reversed
Python jest miły dla programisty, jeśli jest mniej elementów niż prosisz. Na przykład, jeśli poprosisz o a[:-2]
i a
zawiera tylko jeden element, zamiast błędu pojawi się pusta lista. Czasami wolisz błąd, więc musisz mieć świadomość, że może się to zdarzyć.
slice()
przedmiotemOperator krojenia []
jest faktycznie używany w powyższym kodzie z slice()
obiektem używającym :
notacji (która jest poprawna tylko w obrębie []
), tj .:
a[start:stop:step]
jest równa:
a[slice(start, stop, step)]
Obiekty plasterków również zachowują się nieco inaczej w zależności od liczby argumentów, podobnie jak range()
, tj. Oba slice(stop)
i slice(start, stop[, step])
są obsługiwane. Aby pominąć określenie danego argumentu, można użyć None
, aby np. Był a[start:]
równoważny a[slice(start, None)]
lub a[::-1]
równoważny a[slice(None, None, -1)]
.
Podczas gdy :
notacja na podstawie jest bardzo pomocna przy prostym krojeniu, jawne użycie slice()
obiektów upraszcza programowe generowanie krojenia.
None
dowolną pustą przestrzeń. Na przykład[None:None]
wykonuje całą kopię. Jest to przydatne, gdy musisz określić koniec zakresu za pomocą zmiennej i musisz dołączyć ostatni element.del
notację wycinania wrt. W szczególnościdel arr[:]
nie jest od razu oczywiste („arr [:] tworzy kopię, więc del usuwa tę kopię ???” itd.)W Python Tutorial mówi o nim (w dół trochę, aż dojdziesz do części o krojenie).
Schemat artystyczny ASCII jest również pomocny do zapamiętania, jak działają plastry:
źródło
a[-4,-6,-1]
tak będzie,yP
ale tak jestty
. To, co zawsze działa, to myślenie w postaciach lub slotach i stosowanie indeksowania jako półotwartego przedziału - otwarcie prawe, jeśli krok dodatni, otwarcie lewe, jeśli krok ujemny.x[:0]
przypadku rozpoczynania od początku), więc musisz specjalne małe tablice. : /Wymieniając możliwości dozwolone przez gramatykę:
Oczywiście, jeśli
(high-low)%stride != 0
, to punkt końcowy będzie nieco niższy niżhigh-1
.Jeśli
stride
jest ujemne, kolejność jest nieco zmieniona, ponieważ odliczamy:Rozszerzone segmentowanie (z przecinkami i elipsami) jest najczęściej używane tylko przez specjalne struktury danych (takie jak NumPy); podstawowe sekwencje ich nie obsługują.
źródło
repr
__getitem__
jest; twój przykład jest równoważny zapple[slice(4, -4, -1)]
.Odpowiedzi powyżej nie omawiają przypisania plasterków. Aby zrozumieć przypisanie plasterka, pomocne jest dodanie innej koncepcji do grafiki ASCII:
Jedna heurystyka polega na tym, że dla wycinka od zera do n pomyśl: „zero to początek, zacznij od początku i weź n elementów z listy”.
Inna heurystyka to „w przypadku dowolnego wycinka zastąp początkową wartość zerową, zastosuj poprzednią heurystykę, aby uzyskać koniec listy, a następnie policz pierwszą liczbę z powrotem, aby odciąć elementy od początku”
Pierwsza zasada przypisywania wycinka polega na tym, że ponieważ wycinanie zwraca listę, przypisanie wycinka wymaga listy (lub innej iterowalnej):
Drugą zasadą przypisywania wycinka, którą można również zobaczyć powyżej, jest to, że cokolwiek część listy jest zwracana przez indeksowanie wycinków, to ta sama część, która jest zmieniana przez przypisanie wycinków:
Trzecią zasadą przypisywania wycinka jest to, że przypisana lista (iterowalna) nie musi mieć tej samej długości; indeksowany plasterek jest po prostu wycinany i zastępowany masowo przez to, co jest przypisane:
Najtrudniejszą częścią, do której należy się przyzwyczaić, jest przydzielanie pustych plasterków. Za pomocą heurystyki 1 i 2 łatwo jest zaindeksować indeksowanie pustego wycinka:
A kiedy już to zobaczysz, przypisanie wycinka do pustego wycinka również ma sens:
Zauważ, że ponieważ nie zmieniamy drugiej liczby wycinka (4), wstawiane elementy zawsze układają się w stos względem „o”, nawet gdy przypisujemy do pustego wycinka. Zatem pozycja dla przypisania pustego wycinka jest logicznym rozszerzeniem pozycji dla niepustych przypisań wycinka.
Cofając się trochę, co się stanie, gdy będziesz kontynuował naszą procesję liczenia początku plastra?
Z krojeniem, kiedy skończysz, skończysz; nie zaczyna kroić wstecz. W Pythonie nie otrzymujesz ujemnych kroków, chyba że wyraźnie poprosisz o nie, używając liczby ujemnej.
Istnieją dziwne konsekwencje dla zasady „kiedy skończysz, skończysz”:
W rzeczywistości, w porównaniu do indeksowania, krojenie w Pythonie jest dziwnie odporne na błędy:
Czasami może się to przydać, ale może również prowadzić do nieco dziwnych zachowań:
W zależności od aplikacji może to ... lub nie ... być tym, na co liczyłeś!
Poniżej znajduje się tekst mojej oryginalnej odpowiedzi. Przydał się wielu osobom, więc nie chciałem go usuwać.
Może to również wyjaśnić różnicę między krojeniem a indeksowaniem.
źródło
W skrócie, dwukropek (
:
) w notacji indeksem (subscriptable[subscriptarg]
) make plaster notacja - który ma opcjonalnych argumentówstart
,stop
,step
:Wycinanie w języku Python jest obliczeniowo szybkim sposobem na metodyczny dostęp do części danych. Moim zdaniem, aby być nawet pośrednim programistą Python, jest to jeden z aspektów języka, który trzeba znać.
Ważne definicje
Na początek zdefiniujmy kilka terminów:
Jak działa indeksowanie
Możesz wykonać dowolną z tych liczb dodatnich lub ujemnych. Znaczenie liczb dodatnich jest prosta, ale dla liczb ujemnych, podobnie jak indeksy w Pythonie, można liczyć wstecz od końca do początku i zatrzymania , a po kroku , po prostu zmniejszyć swój indeks. Ten przykład pochodzi z samouczka dokumentacji , ale nieco go zmodyfikowałem, aby wskazać, który element w sekwencji odnosi się do każdego indeksu:
Jak działa krojenie
Aby użyć notacji wycinka z sekwencją, która ją obsługuje, musisz umieścić co najmniej jeden dwukropek w nawiasach kwadratowych następujących po sekwencji (które faktycznie implementują
__getitem__
metodę sekwencji, zgodnie z modelem danych Python ).Notacja wycinka działa w następujący sposób:
I pamiętaj, że istnieją wartości domyślne dla startu , stopu i kroku , więc aby uzyskać dostęp do wartości domyślnych, po prostu pomiń argument.
Notacja plastra, aby uzyskać ostatnie dziewięć elementów z listy (lub dowolnej innej sekwencji, która ją obsługuje, np. Ciąg znaków) wyglądałaby następująco:
Kiedy to widzę, czytam tę część w nawiasach jako „9. od końca do końca”. (Właściwie to nazywam to mentalnie jako „-9, on”)
Wyjaśnienie:
Pełna notacja to
i aby zastąpić wartości domyślne (w rzeczywistości, gdy wartość
step
jest ujemna,stop
wartość domyślna to-len(my_list) - 1
, więcNone
dla stop naprawdę oznacza to, że przechodzi do dowolnego kroku końcowego, do którego prowadzi):Okrężnicy ,
:
jest to, co mówi Python dajesz mu kawałek, a nie regularne indeksu. Właśnie dlatego idiomatycznym sposobem tworzenia płytkiej kopii list w Pythonie 2 jestI ich usunięcie polega na:
(Python 3 otrzymuje metodę
list.copy
alist.clear
).Kiedy
step
jest ujemne, wartości domyślnestart
istop
zmieniają sięDomyślnie, gdy
step
argument jest pusty (lubNone
), zostaje przypisany do+1
.Ale możesz podać ujemną liczbę całkowitą, a lista (lub większość innych standardowych slicabli) zostanie pocięta od końca do początku.
Tak więc negatywny plasterek zmieni wartości domyślne dla
start
istop
!Potwierdzenie tego w źródle
Chciałbym zachęcić użytkowników do zapoznania się ze źródłem oraz dokumentacją. Kod źródłowy wycinka obiektów i ta logika jest znaleźć tutaj . Najpierw określamy, czy
step
jest ujemny:Jeśli tak, dolna granica
-1
oznacza, że przecinamy aż do początku włącznie, a górna granica to długość minus 1, co oznacza, że zaczynamy od końca. (Należy pamiętać, że semantyka ta-1
jest różna od A-1
czemu użytkownicy mogą przechodzić indeksów w Pythonie wskazujące ostatni element).W przeciwnym razie
step
jest dodatnia, a dolna granica będzie wynosić zero, a górna granica (do której idziemy do góry, ale nie obejmuje) długości podzielonej listy.Następnie może być konieczne zastosowanie wartości domyślnych dla
start
istop
- wartość domyślna wtedy dlastart
jest obliczana jako górna granica, gdystep
jest ujemna:i
stop
dolna granica:Nadaj swoim plasterkom opisową nazwę!
Przydatne może być oddzielenie formowania wycinka od przekazania go do
list.__getitem__
metody ( to właśnie robią nawiasy kwadratowe ). Nawet jeśli nie jesteś nowy, kod jest bardziej czytelny, dzięki czemu inni, którzy mogą przeczytać kod, mogą łatwiej zrozumieć, co robisz.Nie można jednak przypisać zmiennej do liczb całkowitych oddzielonych dwukropkami. Musisz użyć obiektu plasterka:
Drugi argument,
None
jest wymagany, aby pierwszy argument był interpretowany jakostart
argument, w przeciwnym razie byłby tostop
argument .Następnie możesz przekazać obiekt plasterka do swojej sekwencji:
Interesujące jest to, że zakresy również biorą plasterki:
Uwagi dotyczące pamięci:
Ponieważ wycinki list w języku Python tworzą nowe obiekty w pamięci, kolejną ważną funkcją, o której należy pamiętać, jest
itertools.islice
. Zazwyczaj będziesz chciał iterować fragment, a nie tylko utworzyć go statycznie w pamięci.islice
jest do tego idealny. Zastrzeżenie, nie obsługuje negatywnych argumentów na rzeczstart
,stop
lubstep
, jeśli jest to problem, może być konieczne obliczenie indeksów lub odwrócenie iterowalności z góry.i teraz:
Fakt, że wycinki list tworzą kopię, jest cechą samych list. Jeśli kroisz zaawansowane obiekty, takie jak Pandas DataFrame, może zwrócić widok oryginału, a nie jego kopię.
źródło
I kilka rzeczy, które nie były od razu dla mnie oczywiste, kiedy po raz pierwszy zobaczyłem składnię krojenia:
Łatwy sposób na odwrócenie sekwencji!
A jeśli z jakiegoś powodu chciałeś, co drugi element w odwrotnej kolejności:
źródło
W Pythonie 2.7
Krojenie w Pythonie
Zrozumienie przypisania indeksu jest bardzo ważne.
Kiedy mówisz [a: b: c], mówisz w zależności od znaku c (do przodu lub do tyłu), zacznij od a, a zakończ na b (wyłączając element przy bth index). Użyj powyższej reguły indeksowania i pamiętaj, że znajdziesz tylko elementy z tego zakresu:
Ale zasięg ten jest kontynuowany w obu kierunkach w nieskończoność:
Na przykład:
Jeśli twój wybór a, b i c pozwala na pokrywanie się z powyższym zakresem podczas przechodzenia za pomocą reguł dla a, b, c powyżej, albo otrzymasz listę z elementami (dotkniętymi podczas przechodzenia), albo dostaniesz pustą listę.
I ostatnia rzecz: jeśli aib są równe, to również otrzymujesz pustą listę:
źródło
a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; a[:-2:-2]
który prowadzi do[9]
Znalazłem ten wielki stół na http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
źródło
Po odrobinie użycia zdaję sobie sprawę, że najprostszym opisem jest to, że jest dokładnie taki sam jak argumenty w
for
pętli ...Każda z nich jest opcjonalna:
Następnie indeksowanie ujemne wymaga tylko dodania długości łańcucha do indeksów ujemnych, aby go zrozumieć.
W każdym razie to działa dla mnie ...
źródło
Łatwiej jest mi zapamiętać, jak to działa, a potem mogę wymyślić dowolną kombinację start / stop / krok.
Warto
range()
najpierw zrozumieć :Zacznij od
start
, zwiększajstep
, nie sięgajstop
. Bardzo prosta.O kroku ujemnym należy pamiętać, że
stop
zawsze jest to koniec wykluczony, niezależnie od tego, czy jest wyższy czy niższy. Jeśli chcesz tego samego plasterka w odwrotnej kolejności, znacznie łatwiej jest wykonać odwrócenie osobno: np.'abcde'[1:-2][::-1]
Odciąć jeden znak od lewej, dwa od prawej, a następnie cofa. (Zobacz takżereversed()
.)Krojenie sekwencji jest takie samo, z tym wyjątkiem, że najpierw normalizuje indeksy ujemne i nigdy nie może wyjść poza sekwencję:
DO ZROBIENIA : Poniższy kod zawiera błąd „nigdy nie wychodź poza sekwencję”, gdy abs (krok)> 1; Myślę , że załatałem to, żeby było poprawne, ale trudno to zrozumieć.
Nie martw się o
is None
szczegóły - pamiętaj tylko, że pominięciestart
i / lubstop
zawsze robi to dobrze, aby dać ci całą sekwencję.Normalizacja ujemnych indeksów najpierw pozwala na liczenie startu i / lub zatrzymania od końca niezależnie:
'abcde'[1:-2] == 'abcde'[1:3] == 'bc'
pomimorange(1,-2) == []
. Normalizacja jest czasem uważana za „modulo długość”, ale należy pamiętać, że dodaje długość tylko raz: np.'abcde'[-53:42]
Jest to cały ciąg.źródło
this_is_how_slicing_works
nie to samo co plasterek Pythona. EG[0, 1, 2][-5:3:3]
otrzyma [0] w pythonie, alelist(this_is_how_slicing_works([0, 1, 2], -5, 3, 3))
dostanie [1].range(4)[-200:200:3] == [0, 3]
alelist(this_is_how_slicing_works([0, 1, 2, 3], -200, 200, 3)) == [2]
. Mojaif 0 <= i < len(seq):
próba wdrożenia po prostu „nigdy nie wychodź poza sekwencję”, ale jest błędna dla kroku> 1. Przepiszę go później dzisiaj (z testami).Sam o tym myślę, używając metody „indeksu punktów między elementami”, ale jednym ze sposobów jej opisania, który czasem pomaga innym, jest:
X jest indeksem pierwszego pożądanego elementu.
Y jest indeksem pierwszego elementu, którego nie chcesz.
źródło
Mam nadzieję, że pomoże to w modelowaniu listy w Pythonie.
Odniesienie: http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
źródło
Notacja krojenia w języku Python:
start
iend
ujemne wartości są interpretowane jako odnoszące się do końca sekwencji.end
wskazują pozycję po ostatnim uwzględnionym elemencie.[+0:-0:1]
.start
iend
Notacja rozciąga się na (liczbowe) macierze i tablice wielowymiarowe. Na przykład, aby pokroić całe kolumny, możesz użyć:
Plasterki zawierają odniesienia, a nie kopie elementów tablicy. Jeśli chcesz zrobić oddzielną kopię tablicy, możesz użyć
deepcopy()
.źródło
Możesz także użyć przypisania plasterka, aby usunąć jeden lub więcej elementów z listy:
źródło
To tylko dodatkowe informacje ... Rozważ poniższą listę
Kilka innych sztuczek do odwracania listy:
źródło
Oto jak uczę początkujących plasterków:
Zrozumienie różnicy między indeksowaniem a krojeniem:
Wiki Python ma ten niesamowity obraz, który wyraźnie odróżnia indeksowanie i krojenie.
Jest to lista z sześcioma elementami. Aby lepiej zrozumieć krojenie, rozważ tę listę jako zestaw sześciu pudełek razem. Każde pudełko ma alfabet.
Indeksowanie przypomina postępowanie z zawartością ramki. Możesz sprawdzić zawartość dowolnego pola. Ale nie można sprawdzić zawartości wielu pól jednocześnie. Możesz nawet wymienić zawartość pudełka. Ale nie możesz umieścić dwóch piłek w jednym pudełku ani zastąpić dwóch piłek jednocześnie.
Krojenie jest jak radzenie sobie z pudełkami. Możesz podnieść pierwsze pudełko i umieścić je na innym stole. Aby podnieść skrzynkę, wszystko, co musisz wiedzieć, to pozycja początku i końca skrzynki.
Możesz nawet odebrać pierwsze trzy pola lub ostatnie dwa pola lub wszystkie pola od 1 do 4. Możesz więc wybrać dowolny zestaw pól, jeśli znasz początek i koniec. Pozycje te nazywane są pozycjami start i stop.
Interesujące jest to, że możesz zastąpić wiele pól jednocześnie. Możesz także umieścić wiele pól w dowolnym miejscu.
Krojenie za pomocą kroku:
Do tej pory ciągle wybierałeś pudełka. Ale czasami musisz odebrać dyskretnie. Na przykład możesz odebrać co drugie pudełko. Możesz nawet odebrać co trzecie pudełko od końca. Ta wartość nazywa się wielkością kroku. To reprezentuje lukę między kolejnymi przetwornikami. Rozmiar kroku powinien być dodatni, jeśli wybierasz pudełka od początku do końca i odwrotnie.
Jak Python rozpoznaje brakujące parametry:
Podczas krojenia, jeśli pominiesz jakiś parametr, Python spróbuje go rozgryźć automatycznie.
Jeśli sprawdzisz kod źródłowy CPython , znajdziesz funkcję o nazwie PySlice_GetIndicesEx (), która oblicza wskaźniki dla wycinka dla dowolnych podanych parametrów. Oto logiczny równoważny kod w Pythonie.
Ta funkcja pobiera obiekt Python i opcjonalne parametry do krojenia i zwraca długość początku, zatrzymania, kroku i długości żądanego plasterka.
To inteligencja obecna za plasterkami. Ponieważ Python ma wbudowaną funkcję o nazwie plasterek, możesz przekazać niektóre parametry i sprawdzić, jak mądrze oblicza brakujące parametry.
Uwaga: ten post został pierwotnie napisany na moim blogu, The Intelligence Behind Python Slices .
źródło
Zasadą jest, że pisanie kodu z wieloma zakodowanymi wartościami indeksu prowadzi do bałaganu w zakresie czytelności i konserwacji. Na przykład, jeśli wrócisz do kodu rok później, popatrzysz na niego i zastanawiasz się, co myślisz, kiedy go napisałeś. Przedstawione rozwiązanie jest po prostu sposobem na wyraźniejsze określenie, co faktycznie robi Twój kod. Ogólnie rzecz biorąc, wbudowany slice () tworzy obiekt plasterka, którego można używać wszędzie tam, gdzie dozwolony jest kawałek. Na przykład:
Jeśli masz instancję wycinka, możesz uzyskać więcej informacji na ten temat, patrząc odpowiednio na jego atrybuty s.start, s.stop i s.step. Na przykład:
źródło
1. Notacja plastra
Upraszczając, pamiętaj, że plasterek ma tylko jedną formę form
a oto jak to działa:
s
: obiekt, który można pokroićstart
: pierwszy indeks, aby rozpocząć iteracjęend
: ostatni indeks, UWAGA, żeend
indeks nie zostanie uwzględniony w wynikowym wycinkustep
: wybierz element w każdymstep
indeksieKolejny import rzecz: wszyscy
start
,end
,step
można pominąć! A jeśli są one pomijane, ich wartość zostanie użyta domyślna:0
,len(s)
,1
odpowiednio.Możliwe warianty to:
UWAGA: Jeśli
start >= end
(rozważając tylko kiedystep>0
), Python zwróci pusty plasterek[]
.2. Pułapki
W powyższej części wyjaśniono podstawowe funkcje działania wycinka i zadziała ono w większości przypadków. Mogą jednak wystąpić pułapki, na które należy uważać, a ta część wyjaśnia je.
Wskaźniki ujemne
Pierwszą rzeczą, która dezorientuje uczących się języka Python, jest to, że indeks może być ujemny! Nie panikuj: ujemny indeks oznacza liczyć wstecz.
Na przykład:
Krok negatywny
Sprawianie, że rzeczy są bardziej mylące,
step
może być również negatywne!Krok ujemny oznacza iterację tablicy do tyłu: od końca do początku, z włączonym indeksem końcowym i indeksem początkowym wykluczonym z wyniku.
UWAGA : gdy krok jest ujemny, domyślną wartością
start
jestlen(s)
(chociażend
nie jest równy0
, ponieważs[::-1]
zawieras[0]
). Na przykład:Błąd poza zakresem?
Zaskocz się: wycinek nie podnosi błędu indeksu, gdy indeks jest poza zakresem!
Jeśli indeks jest poza zakresem, Python dołoży wszelkich starań, aby ustawić indeks na
0
lublen(s)
zgodnie z sytuacją. Na przykład:3. Przykłady
Zakończmy tę odpowiedź przykładami, wyjaśniając wszystko, co omówiliśmy:
źródło
Poprzednie odpowiedzi nie omawiają wielowymiarowego dzielenia tablic, co jest możliwe przy użyciu słynnego pakietu NumPy :
Krojenie można również zastosować do tablic wielowymiarowych.
„
:2
” Przed przecinkiem operuje na pierwszym wymiarze, a „0:3:2
” po przecinku na drugim wymiarze.źródło
list
ale tylkoarray
w NumpyMożesz uruchomić ten skrypt i eksperymentować z nim, poniżej jest kilka próbek, które otrzymałem ze skryptu.
W przypadku kroku ujemnego zwróć uwagę, że odpowiedź jest przesunięta w prawo o 1.
źródło
Mój mózg wydaje się szczęśliwy, że
lst[start:end]
zawierastart
-ty element. Mógłbym nawet powiedzieć, że jest to „naturalne założenie”.Ale czasami pojawiają się wątpliwości i mój mózg prosi o zapewnienie, że nie zawiera on-tego
end
elementu.W tych momentach opieram się na tym prostym twierdzeniu:
Ta ładna właściwość mówi mi, że
lst[start:end]
nie zawieraend
-tego elementu, ponieważ jest wlst[end:]
.Zauważ, że to twierdzenie jest prawdziwe dla każdego
n
. Na przykład możesz to sprawdzićzwraca
True
.źródło
Moim zdaniem lepiej zrozumiesz i zapamiętasz notację krojenia ciągów znaków w Pythonie, jeśli spojrzysz na nią w następujący sposób (czytaj dalej).
Pracujmy z następującym ciągiem ...
Dla tych, którzy nie wiedzą, możesz utworzyć dowolny podciąg
azString
za pomocą notacjiazString[x:y]
Pochodząc z innych języków programowania, wtedy zdrowy rozsądek zostaje naruszony. Co to są xiy?
Musiałem usiąść i uruchomić kilka scenariuszy, szukając techniki zapamiętywania, która pomoże mi zapamiętać, czym są xiy, i pomoże mi prawidłowo przeciąć łańcuchy przy pierwszej próbie.
Mój wniosek jest taki, że xiy należy postrzegać jako indeksy brzegowe otaczające ciągi, które chcemy uzupełnić. Powinniśmy więc postrzegać to wyrażenie jako
azString[index1, index2]
lub nawet bardziej wyraźne jakoazString[index_of_first_character, index_after_the_last_character]
.Oto przykładowa wizualizacja tego ...
Wszystko, co musisz zrobić, to ustawić indeks1 i indeks2 na wartości, które będą otaczały pożądany podciąg. Na przykład, aby uzyskać podciąg „cdefgh”, możesz użyć
azString[2:8]
, ponieważ indeks po lewej stronie „c” wynosi 2, a indeks po prawej stronie „h” to 8.Pamiętaj, że wyznaczamy granice. A tymi granicami są pozycje, w których można umieścić nawiasy klamrowe, które zostaną owinięte wokół podciągu w ten sposób ...
ab [ cdefgh ] ij
Ta sztuczka działa cały czas i łatwo ją zapamiętać.
źródło
Większość poprzednich odpowiedzi wyjaśnia pytania dotyczące notacji plastra.
Rozszerzona składnia indeksowania używana do krojenia jest
aList[start:stop:step]
, a podstawowe przykłady to::
Więcej przykładów krojenia: 15 rozszerzonych krojów
źródło
W Pythonie najbardziej podstawową formą krojenia jest:
gdzie
l
jest jakaś kolekcja,start
jest indeksem włączającym iend
jest indeksem wyłącznym.Podczas krojenia od samego początku można pominąć indeks zerowy, a podczas krojenia do końca można pominąć indeks końcowy, ponieważ jest on zbędny, więc nie należy powtarzać:
Ujemne liczby całkowite są użyteczne podczas wykonywania przesunięć względem końca kolekcji:
Podczas krojenia można podać wskaźniki, które są poza zakresem, takie jak:
Pamiętaj, że wynikiem krojenia kolekcji jest zupełnie nowa kolekcja. Ponadto w przypadku przypisania wycinka w przypisaniach długość przypisań wycinka nie musi być taka sama. Wartości przed i po przypisanym wycinku zostaną zachowane, a kolekcja zmniejszy się lub powiększy, aby zawierać nowe wartości:
Jeśli pominiesz indeks początkowy i końcowy, utworzysz kopię kolekcji:
Jeśli indeksy początkowy i końcowy zostaną pominięte podczas wykonywania operacji przypisania, cała zawartość kolekcji zostanie zastąpiona kopią tego, do którego się odwołuje:
Oprócz podstawowego krojenia można również zastosować następującą notację:
gdzie
l
jest kolekcją,start
jest indeksem włączającym,end
jest indeksem wyłącznym istep
jest krokiem, którego można użyć, aby wziąć co n-ty przedmiotl
.Użycie
step
zapewnia przydatną sztuczkę do odwrócenia kolekcji w Pythonie:Możliwe jest również użycie ujemnych liczb całkowitych dla
step
następującego przykładu:Jednak użycie wartości ujemnej dla
step
może stać się bardzo mylące. Ponadto, aby być pythonic , należy unikaćstart
,end
orazstep
w pojedynczym segmencie. Jeśli jest to wymagane, zastanów się nad zrobieniem tego w dwóch zadaniach (jednym do pokrojenia, a drugim do kroku).źródło
Chcę dodać jedno Witaj, świecie! przykład wyjaśniający podstawy plasterków dla początkujących. Bardzo mi pomogło.
Zróbmy listę z sześcioma wartościami
['P', 'Y', 'T', 'H', 'O', 'N']
:Teraz najprostszymi plasterkami tej listy są podlisty. Notacja jest,
[<index>:<index>]
a kluczem jest odczytanie jej w następujący sposób:Teraz, jeśli utworzysz kawałek
[2:5]
powyższej listy, stanie się to:Wykonałeś cięcie przed elementem z indeksem
2
i kolejne cięcie przed elementem z indeksem5
. Tak więc wynikiem będzie plasterek między tymi dwoma cięciami, lista['T', 'H', 'O']
.źródło
Osobiście myślę o tym jak o
for
pętli:Zauważ też, że ujemne wartości dla
start
iend
są względem końca listy i obliczone w powyższym przykładzie przezgiven_index + a.shape[0]
.źródło
Poniżej znajduje się przykład indeksu ciągu:
Przykład krojenia: [start: koniec: krok]
Poniżej znajduje się przykładowe użycie:
źródło
Jeśli uważasz, że ujemne wskaźniki w krojeniu są mylące, oto bardzo prosty sposób, aby o tym pomyśleć: po prostu zastąp indeks ujemny przez
len - index
. Na przykład zamień -3 nalen(list) - 3
.Najlepszym sposobem zilustrowania wewnętrznego podziału na plastry jest po prostu pokazanie go w kodzie implementującym tę operację:
źródło
Podstawową techniką krojenia jest określenie punktu początkowego, punktu zatrzymania i wielkości kroku - znanej również jako krok.
Najpierw stworzymy listę wartości do wykorzystania w naszym krojeniu.
Utwórz dwie listy do wycięcia. Pierwsza to lista numeryczna od 1 do 9 (Lista A). Druga to także lista numeryczna od 0 do 9 (Lista B):
Zindeksuj liczbę 3 od A i liczbę 6 od B.
Podstawowe krojenie
Rozszerzona składnia indeksowania używana do krojenia to aList [start: stop: step]. Argument początkowy i krokowy domyślnie nie ma wartości - jedynym wymaganym argumentem jest stop. Czy zauważyłeś, że jest to podobne do tego, w jaki sposób użyto zakresu do zdefiniowania list A i B? Wynika to z faktu, że obiekt wycinka reprezentuje zestaw wskaźników określonych przez zakres (początek, stop, krok). Dokumentacja Python 3.4.
Jak widać, zdefiniowanie tylko stop zwraca jeden element. Ponieważ domyślnym początkiem jest brak, przekłada się to na pobranie tylko jednego elementu.
Należy zauważyć, że pierwszym elementem jest indeks 0, a nie indeks 1. Dlatego do tego ćwiczenia używamy 2 list. Elementy listy A są ponumerowane zgodnie z pozycją porządkową (pierwszy element to 1, drugi element to 2 itd.), Natomiast elementy listy B to liczby, które zostałyby użyte do ich indeksowania ([0] dla pierwszego elementu 0, itp.).
Dzięki rozszerzonej składni indeksowania pobieramy zakres wartości. Na przykład wszystkie wartości są pobierane za pomocą dwukropka.
Aby pobrać podzbiór elementów, należy zdefiniować pozycje początkową i końcową.
Biorąc pod uwagę wzorzec aList [start: stop], pobierz pierwsze dwa elementy z Listy A.
źródło
Nie sądzę, że schemat samouczka w języku Python (cytowany w różnych innych odpowiedziach) jest dobry, ponieważ ta sugestia działa pozytywnie, ale nie działa negatywnie.
Oto schemat:
Z diagramu oczekuję, że
a[-4,-6,-1]
tak będzie,yP
ale tak jestty
.To, co zawsze działa, to myślenie w postaciach lub slotach i stosowanie indeksowania jako półotwartego przedziału - otwarcie prawe, jeśli krok dodatni, otwarcie lewe, jeśli krok ujemny.
W ten sposób mogę myśleć
a[-4:-6:-1]
, jaka(-6,-4]
w przedziale terminologii.źródło