Een lijst opdelen met behulp van een variabele, in Python

Gegeven een lijst

a = range(10)

Je kunt het segmenteren met uitspraken als

a[1]
a[2:4]

Ik wil dit echter doen op basis van een variabele die elders in de code is ingesteld. Ik kan dit gemakkelijk doen voor de eerste

i = 1
a[i]

Maar hoe doe ik dit voor de andere? Ik heb geprobeerd te indexeren met een lijst:

i = [2, 3, 4]
a[i]

Maar dat werkt niet. Ik heb ook geprobeerd een string te gebruiken:

i = "2:4"
a[i]

Maar dat werkt ook niet.

Is dit mogelijk?


Antwoord 1, autoriteit 100%

daar is slice()voor :

a = range(10)
s = slice(2,4)
print a[s]

Dat is hetzelfde als het gebruik van a[2:4].


Antwoord 2, autoriteit 10%

Waarom moet het een enkele variabele zijn? Gebruik gewoon twee variabelen:

i, j = 2, 4
a[i:j]

Als het echteen enkele variabele moet zijn, kun je een tuple gebruiken.


Antwoord 3, autoriteit 3%

Met de onderstaande toewijzingen gebruik je nog steeds hetzelfde type slicing-bewerkingen die je laat zien, maar nu met variabelen voor de waarden.

a = range(10)
i = 2
j = 4

dan

print a[i:j]
[2, 3]

Antwoord 4, autoriteit 2%

>>> a=range(10)
>>> i=[2,3,4]
>>> a[i[0]:i[-1]]
range(2, 4)
>>> list(a[i[0]:i[-1]])
[2, 3]

Antwoord 5, autoriteit 2%

Ik kwam dit onlangs tegen toen ik opzocht hoe de gebruiker de gebruikelijke slice-syntaxis van a:b:c, ::c, enz. kan nabootsen via argumenten doorgegeven op de opdrachtregel.

Het argument wordt gelezen als een string, en ik splits liever niet op ':', geef dat door aan slice(), enz. Bovendien, als de gebruiker geeft een enkelgeheel getal idoor, de bedoelde betekenis is duidelijk a[i]. Desalniettemin zal slice(i)standaard slice(None,i,None)zijn, wat niet het gewenste resultaat is.

In ieder geval was de meest rechttoe rechtaan oplossing die ik kon bedenken om de string in te lezen als een variabele stzeg, en dan het gewenste lijstsegment te herstellen als eval(f"a[{st}]").

Dit gebruikt de eval()ingebouwd en een f-stringwaarbij sttussen de accolades is geïnterpoleerd. Het verwerkt precies de gebruikelijke door dubbele punten gescheiden slicing-syntaxis, omdat het gewoon die dubbele punt-bevattende tekenreeks inplugt zoals het is.

Other episodes