Python lijst / sublijst selectie -1 gekheid

Dus ik heb wat met python gespeeld en merkte iets op dat een beetje vreemd lijkt. De semantiek van -1bij het selecteren uit een lijst lijkt niet consistent te zijn.

Dus ik heb een lijst met nummers

ls = range(1000)

Het laatste element van de lijst is natuurlijk ls[-1]maar als ik daar een sublijst van neem, zodat ik alles van het middelpunt tot het einde krijg, zou ik dat doen

ls[500:-1]

maar dit geeft me geen lijst met het laatste element in de lijst, maar in plaats daarvan een lijst met alles TOT het laatste element. Maar als ik dat doe

ls[0:10]

Ik krijg een lijst die ook het tiende element bevat (dus de selector zou inclusief moeten zijn), waarom werkt het dan niet voor -1.

Ik kan natuurlijk ls[500:]of ls[500:len(ls)]doen (wat dom zou zijn). Ik vroeg me gewoon af wat de deal met -1 was, ik realiseer me dat ik het daar niet nodig heb.


Antwoord 1, autoriteit 100%

In list[first:last]is lastniet opgenomen.

Het 10e element is ls[9], in ls[0:10]is er geen ls[10].


Antwoord 2, autoriteit 24%

Als je een sublijst wilt met het laatste element, laat je na de dubbele punt leeg:

>>> ll=range(10)
>>> ll
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ll[5:]
[5, 6, 7, 8, 9]
>>> ll[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Antwoord 3, autoriteit 4%

Ik krijg consistent gedrag voor beide gevallen:

>>> ls[0:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ls[10:-1]
[10, 11, 12, 13, 14, 15, 16, 17, 18]

Let op, hoewel, dat tiende element van de lijst is op index 9 , omdat de lijst is 0-geïndexeerd. Dat zou kunnen zijn waar uw hang-up is.

Met andere woorden, [0:10]niet verder uit de index van 0-10, het effectief gaat van 0 tot en met de tiende element (die u indexen 0-9 krijgt, omdat de 10 is niet volledig aan het einde van het segment).


Antwoord 4, Autoriteit 3%

bij het snijden een matrix;

ls[y:x]  

neemt het segment van element y upto en met uitzondering van x. wanneer je de negatieve indexering gebruiken is gelijk aan het gebruik

ls[y:-1] == ls[y:len(ls)-1]

dus zo het segment zou tot aan de laatste element, maar het zou niet opnemen (volgens de slice)


Antwoord 5, Autoriteit 2%

Het lijkt redelijk consistent mij; positieve indices zijn ook niet inbegrepen. Ik denk dat je het verkeerd doet. Herinneren dat bereik () is niet inbegrepen, en dat Python arrays 0-geïndexeerd, is hier een voorbeeld python sessie ter illustratie:

>>> d = range(10)
>>> d
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> d[9]
9
>>> d[-1]
9
>>> d[0:9]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> d[0:-1]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> len(d)
10

Antwoord 6, Autoriteit 2%

-1 is niet speciaal in die zin dat de reeks achterstevoren wordt gelezen, maar om de uiteinden heen loopt. Zodanig dat min één gelijk is aan nul min één, exclusief(en voor een positieve stapwaarde wordt de reeks gelezen “van links naar rechts”.

dus voor i = [1, 2, 3, 4], i[2:-1]betekent van item twee tot de beginnend min één (of ‘rond tot het einde’), wat resulteert in [3].
Het -1e element, of element 0 achterwaarts 1is de laatste 4, maar omdat het exclusief is, krijgen we 3.

Ik hoop dat dit enigszins begrijpelijk is.

Other episodes