Mai mult
Înțelegerea felie notație
Am nevoie de o explicație bună (referințele sunt un plus) pe Python's felie de notație.
Pentru mine, această notație are nevoie de un pic de cules.
Se pare extrem de puternic, dar nu am't destul de capul meu în jurul valorii de ea.
2992
32
L's destul de simplu:
Există, de asemenea, " pas " valoare, care poate fi folosit cu oricare dintre cele de mai sus:
Punctul cheie este să-ți amintești că:stop` valoare reprezintă prima valoare care este nu în selectată felie. Deci, diferența între "stop" și "start" este numărul de elemente selectate (dacă " pas " este 1, default).
Altă caracteristică este că "start" sau "stop" poate fi o negativ număr, ceea ce înseamnă că nu contează de la sfârșitul matrice în loc de la început. Deci:
În mod similar, " pas " poate fi un număr negativ:
Python este un fel de programator, dacă există mai puține elemente decât ceri. De exemplu, dacă vă întreb pentru o[:-2]
și
o` conține doar un singur element, veți obține o listă goală în loc de o eroare. Uneori ar prefera eroare, așa că trebuie să fie conștienți de faptul că acest lucru se poate întâmpla.Raport cu
slice()
obiectFelierea operator
[]
este, de fapt folosit în codul de mai sus cu o felie()obiect folosind
:notație (care este valabil numai în cadrul
[]`), adică:este echivalent cu:
Felie de obiecte comporta, de asemenea, ușor diferit, în funcție de numărul de argumente, în mod similar cu raza()
, adică
slice(oprire) " și " felie(start, stop[, pas]) sunt acceptate. Pentru a sări peste specificarea unui anumit argument, s-ar putea folosi "Nici unul", așa că, de exemplu, o[start:]este echivalent cu
o[felie(start, Nici unul)] " sau " o[::-1]este echivalent cu
o[felie(Niciunul, Niciuna, -1)]`.În timp ce
:
pe baza de notație este foarte util pentru simplu feliere, utilizarea explicită aslice()
obiecte simplifică programatic generație de feliere.De tutorial Python vorbește despre asta (derulați în jos un pic, până când ajunge la partea de feliere).
Arta ASCII diagrama este util pentru amintindu-mi cât de felii de lucru:
Enumerarea posibilităților permise de gramatică:
Desigur, dacă
(high-low)%pas != 0, atunci punctul final va fi un pic mai mic decât
mare-1`.Dacă
pas
este negativ, comanda este schimbat un pic, deoarece am're de numărare în jos:Extins feliere (cu virgule și puncte de suspensie) sunt cele mai utilizate numai de către speciali structuri de date (cum ar fi NumPy); secvențele de bază don't să le sprijine.
Răspunsurile de mai sus nu't discuta felie de atribuire. Pentru a înțelege felie de atribuire, l's util pentru a adăuga un alt concept de arta ASCII:
Unul euristic este, pentru o felie de la zero la n, cred că: "zero este la început, de la început și să ia n elemente într-o listă".
O altă euristică este, "pentru orice felie, înlocuiți la început de la zero, se aplică anterior euristice pentru a ajunge la sfârșitul listei, apoi conta primul număr înapoi să taie elementele de pe la începutul"
Prima regulă de felie misiune este aceea de feliere revine o listă, o felie de atribuire ** necesită o lista (sau alte iterable):
A doua regulă de felie de cesiune, pe care le puteți vedea, de asemenea, de mai sus, este că orice parte din lista este returnat de felie de indexare, care's aceeași porțiune care este schimbat de felie de atribuire:
Regula a treia felie de atribuire este desemnat lista (iterable) nu't trebuie să aibă aceeași lungime; indexate felie este pur și simplu tăiate și înlocuite en masse de tot ce este de a fi atribuit:
Partea cea mai grea este să te obișnuiești cu misiune este de a goli felii. Folosind euristica 1 și 2 se's ușor pentru a obține capul în jurul valorii de indexare un gol felie:
Și apoi, o dată ce'am văzut că, felie misiune la gol felie are sens:
Rețineți că, din moment ce nu sunt în schimbare al doilea număr al felie (4), elementele inserate întotdeauna stivă până împotriva 'o', chiar și atunci când ne-am're atribuirea la gol felie. Deci poziția de gol felie de atribuire este extensia logică a pozițiile pentru non-gol felie misiuni.
Back-up un pic, ce se întâmplă când mergi cu procesiunea noastră de numărare până felie început?
Cu feliere, odată ce're făcut, ai're face; nu't începe feliere invers. În Python nu't negative pași dacă vă întreb în mod explicit pentru ei, folosind un număr negativ.
Există unele ciudat consecințe la "odată ce ai're făcut, ai're face" regula:
În fapt, în comparație cu indexare, Python feliere este bizar eroare-dovada:
Acest lucru poate veni la îndemână, uneori, dar de asemenea, poate duce la un comportament ciudat:
În funcție de aplicația dumneavoastră, care ar putea... sau poate nu... fii ceea ce ai fost în speranța de acolo!
Mai jos este textul meu original răspuns. Acesta a fost util pentru mulți oameni, așa că m-am't doriți să-l ștergeți.
Acest lucru poate, de asemenea, să clarifice diferența dintre feliere și indexare.
Python secționare este un calcul rapid mod de a metodic acces la părți ale datelor. În opinia mea, să fie chiar un intermediar Python programmer, l's un aspect de limba în care este necesar să fie familiarizat cu.
Importante Definiții
Pentru a începe cu, las's definim câțiva termeni:
Cum Feliere Funcționează
Pentru a utiliza felie de notație cu o secvență care acceptă aceasta, trebuie să includă cel puțin un colon în paranteze pătrate care urmează secvența (care de fapt pună în aplicare `getitem metoda de ordine, potrivit Python model de date.) Felie notație funcționează ca aceasta:
Și să nu uităm că nu sunt implicite pentru start, stop, și pas, deci pentru a accesa setările implicite, pur și simplu lăsați afară argument. Felie notație pentru a obține ultimele nouă elemente dintr-o listă (sau orice alte secvențe care acceptă, ca un șir de caractere) ar arata astfel:
Când am văzut asta, am citit o parte din paranteze ca "a 9-a de la capăt, până la capăt." (de Fapt, am abreviat mental ca "-9, pe")
Explicatie:
Complet notație este
și să înlocuiască valorile implicite (de fapt, atunci când " pas "este negativ, "stop" 's implicită este
-len(my_list) - 1
, deci "Nimic" pentru a opri într-adevăr înseamnă doar a merge la oricare end pas va duce să):La colon,
:
, este ceea ce spune Python're dându-i o felie de pizza și un index. Ca's de ce idiomatice mod de a face o copie superficială a listelor în Python 2 esteȘi de compensare-le este cu:
(Python 3 primeste o lista de asteptare.copie " și " lista.clar metoda.)
Când " pas "este negativ, implicite pentru "start" și "stop" schimba
În mod implicit, atunci când " pas "argument este gol (sau "Nici unul"), este atribuit
+1
. Dar poți trece într-un număr întreg negativ, și lista (sau cele mai multe alte standard slicables) vor fi tăiate de la sfârșitul de la început. Astfel, un negativ felie se va schimba setările implicite pentru "start" și "stop"!Confirmă acest lucru în sursa
Îmi place pentru a încuraja utilizatorii să citească sursă, precum și documentația. De codul sursă pentru o felie de obiecte și această logică se găsește aici. Mai întâi vom determina dacă " pas " este negativ:
Cel de-al doilea argument, "Nici unul", este necesară, astfel că primul argument este interpretat ca "start" argument altfel ar fi "stop" argument. Apoi, puteți trece felie de acord cu secvența:
L's interesante, care variază, de asemenea, să ia felii:
Memorie Considerente:
Din felii de Python liste de a crea noi obiecte în memorie, o altă funcție importantă să fie conștienți de este
itertools.islice
. De obicei te'll vreau să itera peste o felie, nu doar l-au creat static în memorie.islice
este perfect pentru acest lucru. O precizare, nu't suport negativ argumente la "start", "stop", sau "pas", deci, dacă asta's o problemă s-ar putea nevoie pentru a calcula indici sau inversa iterable în avans.și acum:
Faptul că lista felii face o copie este o caracteristică de liste de ei înșiși. Daca're feliere avansate de obiecte ca un Panda DataFrame, acesta poate reveni la o vizualizare pe original si nu o copie.
Și un cuplu de lucruri pe care nu't imediat evident pentru mine când am văzut prima feliere sintaxa:
Modalitate ușoară de a inversa secvențe!
Și dacă ai vrut, pentru un motiv oarecare, fiecare al doilea element din a inversat ordinea:
În Python 2.7
Feliere în Python
Înțelegerea indicele de sarcină este foarte important.
Când spui [a:b:c], vă spun, în funcție de semnul c (înainte sau înapoi), începe de la a și se termină la b (cu excepția element la bth index). Utilizarea indexarea regula de mai sus și amintiți-vă, veți găsi doar elemente în acest interval:
Dar această gamă continuă în ambele direcții infinit:
De exemplu:
Dacă alegerea ta a, b, și c permite suprapune cu intervalul de mai sus în timp ce traversa folosind regulile pentru a,b,c de mai sus, veți obține o listă cu elemente (atins în timpul de traversare) sau veți obține o listă goală.
Un ultim lucru: dacă a și b sunt egale, atunci, de asemenea, veți obține o listă goală:
Găsit această mare masă de la http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
După folosind-o un pic am dat seama că cea mai simplă descriere este că acesta este exact la fel ca argumente într-o "pentru" bucla...
Oricare dintre ele sunt opționale:
Apoi negativ de indexare trebuie doar să adăugați lungimea șir de indici negativi, să-l înțeleagă.
Aceasta funcționează pentru mine, oricum...
Mi-e mai ușor să vă amintiți cum funcționează, și atunci îmi dau seama specifice start/stop/pas combinație.
L's instructiv pentru a înțelege intervalul()` prima:
Începe de la "start", sporul de "pas", nu ajunge la "stop". Foarte simplu.
Lucru de reținut despre negativ pas este ca "stop" este întotdeauna excluse din urmă, dacă-l's mai mari sau mai mici. Dacă doriți aceeași felie în ordine inversă, l's mult mai curat de a face anularea în parte: de exemplu,
'abcde'[1:-2][::-1]
felii de pe un char de la stânga, doi la dreapta, apoi se inversează. (A se vedea, de asemenea, [inversat()
][1].)Secvența de feliere este același, cu excepția faptului că prima normalizeaza negativ indicii, și niciodată nu poate merge în afara secvență:
TODO: codul De mai jos a avut un bug cu "niciodată nu merg în afara secvenței" atunci când abs(pas)>1; I cred că patch-uri pentru a fi corect, dar's greu de înțeles.
Eu folosesc "un indice de puncte între elemente" metodă de a gândi despre mine însumi, dar și o modalitate de a descrie care, uneori, îi ajută pe ceilalți să ia-o este aceasta:
X este indicele primului element pe care doriți. Y este indicele primului element te nici't vrei.
Python feliere notație:
[+0:-0:1]
.Notația se extinde la (numpy) matrice și tablouri multidimensionale. De exemplu, pentru a felie întregii coloane pe care le puteți utiliza:
Felii deține referințe, nu copii, de elementele de matrice. Dacă doriți să faceți o copie separată o matrice, puteți utiliza
deepcopy()
.Acest lucru este cum am învățat felii pentru începători:
Înțelegerea diferenței dintre indexare și feliere:
Wiki Python are această imagine uimitoare, care se distinge în mod clar de indexare și feliere.
Aceasta este o listă cu șase elemente în ea. Pentru a înțelege feliere mai bine, ia în considerare această listă ca un set de șase cutii plasate împreună. Fiecare cutie are un alfabet în ea.
Indexarea este ca de-a face cu conținutul cutiei. Puteți verifica conținutul de orice cutie. Dar poate't verificați conținutul de cutii multiple la o dată. Puteți chiar să înlocuiască conținutul cutiei. Dar poate't loc două bile într-o cutie sau înlocuiți două bile la un moment dat.
Feliere este ca de-a face cu cutii de ei înșiși. Vă puteți ridica prima cutie și puneți-l pe o altă masă. Pentru a ridica cutia, tot ce trebuie să știi este poziția de început și sfârșit de cutie.
Puteți alege chiar și până la primele trei cutii sau ultimele două cutii sau toate casetele între 1 și 4. Deci, puteți alege orice set de cutii, dacă știi de la început și se termină. Aceste poziții sunt numite porni și opri poziții.
Cel mai interesant lucru este că puteți înlocui mai multe cutii, la o dată. De asemenea, puteți plasa mai multe cutii de oriunde doriți.
Feliere Cu Pas:
Până acum ți-au luat cutii continuu. Dar, uneori, aveți nevoie pentru a ridica discret. De exemplu, vă puteți ridica fiecare a doua cutie. Puteți alege chiar și până la fiecare a treia caseta de la sfârșitul anului. Această valoare se numește pas dimensiune. Aceasta reprezintă diferența între succesive camionete. Dimensiunea pas ar trebui să fie pozitiv dacă se iau cutii de la început până la sfârșit și invers.
Cum Python Cifre Din Lipsă De Parametri:
Când feliere, dacă vă lăsați orice parametru, Python încearcă să-și dea seama în mod automat.
Dacă tu a verifica codul sursă de CPython, veți găsi o funcție numită PySlice_GetIndicesEx() care cifrele indici pentru o felie pentru orice parametri. Aici este logic cod echivalent în Python.
Această funcție are un obiect Python și parametrii opționali pentru feliere și se întoarce la pornire, oprire, pas, și felie de lungime a solicitat felie.
Aceasta este inteligența care este prezent în spatele felii. Deoarece Python are o funcție built-in numit felie, puteți trece unii parametri și să verificați cât de inteligent se calculează lipsește parametri.
Notă: Acest post a fost scris inițial în blog-ul meu, Inteligenței Spatele Python Felii.
Puteți folosi, de asemenea, felie misiune pentru a elimina unul sau mai multe elemente dintr-o listă:
Acest lucru este doar pentru cateva informatii suplimentare... Luați în considerare lista de mai jos
Alte câteva trucuri pentru inversarea lista:
Ca regulă generală, scrierea de cod cu o mulțime de hardcoded valorile indicelui duce la o lizibilitate și de întreținere mizerie. De exemplu, dacă te întorci la codul un an mai târziu, va uita-te la ea și mă întreb de ce te-ai gândit când ai scris-o. Soluția prezentată este pur și simplu un mod mai clar de ce codul este, de fapt face. În general, built-in felie() creează o felie obiect care poate fi folosit oriunde o felie este permis. De exemplu:
Dacă aveți o felie de exemplu, s, puteți obține mai multe informații despre el uitandu-se la ei s.start, s.opri, și s.pas atribute, respectiv. De exemplu:
1. Felie Notație
Pentru a face simplu, amintiți-vă felie are o singură formă de:
și aici este modul în care funcționează:
Un alt import de lucru: toate "start", "sfârșitul", " pas " poate fi omis! Și dacă sunt omise, valoarea lor implicită va fi folosit:
0
,len(s)
,1
în mod corespunzător.Deci, variantele posibile sunt:
NOTĂ: Dacă
start >= end
(luând în considerare numai atunci când pas>0), Python va reveni un gol felie
[]`.2. Capcane
Partea de mai sus explică caracteristicile de bază privind modul felie de lucrări, și se va lucra pe cele mai multe ocazii. Cu toate acestea, nu poate fi capcane ar trebui să ai grijă, și această parte explică ei.
Negativ indicii
Primul lucru care confundă Python elevii este că un index poate fi negativ! Don't de panică: un indice negativ înseamnă să numeri invers.
De exemplu:
Negativ pas
A face lucrurile mai confuz este faptul că " pas " poate fi negativ prea!
Un negativ pas înseamnă repeta matrice invers: de la sfârșitul pentru a începe, odată cu sfârșitul index incluse, și începe index excluse din rezultatul.
NOTĂ: atunci când pas este negativ, valoarea implicită pentru
start
este, len(s)
(în timp ce " end "nu este egal cu a0
, pentru căs[::-1] "conține" s[0]
). De exemplu:În afara intervalului de eroare?
Fi surprins: felie nu ridică o eroare indexerror când indicele este în afara razei de acțiune!
Dacă indicele este în afara intervalului, Python va încerca tot posibilul pentru a stabili indicele
0
sau `len(s) în funcție de situație. De exemplu:3. Exemple
Las's a termina acest răspuns cu exemple, explicând tot ceea ce am discutat:
Răspunsurile anterioare nu't a discuta despre multi-dimensional matrice feliere care este posibil, folosind celebrul NumPy pachet:
Feliere poate fi, de asemenea, aplicate pentru a matrice multi-dimensionale.
"
:2
" înainte de virgulă funcționează pe prima dimensiune și "0:3:2
" după virgulă operează pe cea de-a doua dimensiune.Puteți rula acest script și experiment cu ea, mai jos sunt câteva probe care am primit de la script-ul.
Atunci când se utilizează un negativ pas, observa că răspunsul este decalat spre dreapta cu 1.