web-dev-qa-db-fra.com

Découpage d'une liste à l'aide d'une variable, en Python

Étant donné une liste

a = range(10)

Vous pouvez le découper en utilisant des instructions telles que

a[1]
a[2:4]

Cependant, je veux le faire en fonction d'une variable définie ailleurs dans le code. Je peux facilement le faire pour le premier

i = 1
a[i]

Mais comment dois-je faire cela pour l'autre? J'ai essayé l'indexation avec une liste:

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

Mais ça ne marche pas. J'ai également essayé d'utiliser une chaîne:

i = "2:4"
a[i]

Mais cela ne fonctionne pas non plus.

Est-ce possible?

37
robintw

c'est ce que slice() est pour:

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

Cela revient à utiliser a[2:4].

79
mata

Pourquoi doit-il s'agir d'une seule variable? Utilisez simplement deux variables:

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

Si cela vraiment doit être une seule variable, vous pouvez utiliser un Tuple.

9
Mark Byers
>>> a=range(10)
>>> i=[2,3,4]

>>> a[i[0]:i[-1]]
range(2, 4)

>>> list(a[i[0]:i[-1]])
[2, 3]
2

Avec les affectations ci-dessous, vous utilisez toujours le même type d'opérations de découpage que vous montrez, mais maintenant avec des variables pour les valeurs.

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

puis

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

J'ai récemment rencontré cela, tout en cherchant comment faire pour que l'utilisateur imite la syntaxe de tranche habituelle de a:b:c, ::c, Etc. via des arguments passés sur la ligne de commande.

L'argument est lu comme une chaîne, et je préfère ne pas diviser sur ':', Le transmettre à slice(), etc. En outre, si l'utilisateur passe un simple entier i, la signification voulue est clairement a[i]. Néanmoins, slice(i) sera par défaut à slice(None,i,None), ce qui n'est pas le résultat souhaité.

Dans tous les cas, la solution la plus simple que j'ai pu trouver était de lire la chaîne sous la forme d'une variable st disons, puis de récupérer la tranche de liste souhaitée en tant que eval(f"a[{st}]").

Cela utilise le eval () intégré et un f-stringst est interpolé à l'intérieur des accolades. Il gère précisément la syntaxe de découpage séparée par deux-points habituelle, car il ne fait que connecter cette chaîne contenant les deux-points en l'état.

0
grobber