4 votes

Python : Vous voulez utiliser une chaîne de caractères comme spécificateur de tranche ?

Supposons que j'ai une variable S avec le chaîne de caractères "1:3" (ou pour cette question, "1" o "1:" o ":3" ) et je veux l'utiliser comme spécificateur de tranche sur liste L . Vous ne pouvez pas simplement faire L[S] puisque les arguments requis pour une tranche sont "int:int" .

Maintenant, j'ai actuellement un code moche qui analyse S en ses deux composantes int et traite tous les cas limites (4 d'entre eux) pour obtenir l'accès correct à la tranche, mais ceci est tout simplement laid et impythique.

Comment puis-je prendre élégamment la ficelle S et l'utiliser comme spécificateur de tranche ?

5voto

Lattyware Points 37257

Cela peut être fait sans trop de difficultés en utilisant une liste de compréhension. Nous divisons la chaîne de caractères sur : en transmettant les éléments fractionnés comme arguments à la méthode slice() builtin. Cela nous permet de produire la tranche en une seule ligne, d'une manière qui fonctionne dans tous les cas auxquels je peux penser :

slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])

En utilisant le slice() nous évitons de devoir gérer nous-mêmes un trop grand nombre de cas limites.

Exemple d'utilisation :

>>> some_list = [1, 2, 3]
>>> string_slice = ":2"
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
[1, 2]
>>> string_slice = "::-1"
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
[3, 2, 1]

1voto

vivek Points 1333

Voici une autre solution

eval("L[%s]" % S) 

_avertissement - Ce n'est pas sûr si S provient d'une source externe (non fiable)._

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X