101 votes

Python tranche le premier et le dernier élément de la liste

Existe-t-il un moyen de couper uniquement le premier et le dernier élément d'une liste ?

Par exemple : si c'est ma liste :

>>> some_list
['1', 'B', '3', 'D', '5', 'F']

I veulent pour ce faire (évidemment [0,-1] n'est pas une syntaxe valide) :

>>> first_item, last_item = some_list[0,-1]
>>> print first_item
'1'
>>> print last_item
'F'

Certaines choses que j'ai essayées :

In [3]: some_list[::-1]
Out[3]: ['F', '5', 'D', '3', 'B', '1']

In [4]: some_list[-1:1:-1]
Out[4]: ['F', '5', 'D', '3']

In [5]: some_list[0:-1:-1]
Out[5]: []
...

7voto

Oleh Prypin Points 9086

Vous pouvez le faire comme ça :

some_list[0::len(some_list)-1]

7voto

pemistahl Points 2413

Et ça ?

>>> first_element, last_element = some_list[0], some_list[-1]

6voto

Chiel92 Points 2362

Vous pouvez utiliser quelque chose comme

y[::max(1, len(y)-1)]

si vous voulez vraiment utiliser le tranchage. L'avantage de cette méthode est qu'elle ne peut pas donner d'erreurs d'index et qu'elle fonctionne également avec des listes de longueur 1 ou 0.

5voto

ShadowRanger Points 44

Ce n'est pas une "tranche", mais c'est une solution générale qui n'utilise pas d'indexation explicite, et qui fonctionne pour le scénario où la séquence en question est anonyme (vous pouvez donc créer et "trancher" sur la même ligne, sans créer deux fois et indexer deux fois) : operator.itemgetter

import operator

# Done once and reused
first_and_last = operator.itemgetter(0, -1)

...

first, last = first_and_last(some_list)

Vous pourriez simplement le mettre en ligne comme (après from operator import itemgetter pour des raisons de brièveté au moment de l'utilisation) :

first, last = itemgetter(0, -1)(some_list)

mais si vous êtes amené à réutiliser souvent le getter, vous pouvez vous épargner le travail de le recréer (et lui donner un nom utile et auto-documenté) en le créant une fois à l'avance.

Ainsi, pour votre cas d'utilisation spécifique, vous pouvez remplacer :

x, y = a.split("-")[0], a.split("-")[-1]

avec :

x, y = itemgetter(0, -1)(a.split("-"))

y split une seule fois sans stocker l'ensemble des list dans un nom persistant pour len vérification ou double indexation ou autre.

Notez que itemgetter pour plusieurs éléments renvoie un tuple et non un list Donc, si vous ne vous contentez pas de le décompresser vers des noms spécifiques, et que vous avez besoin d'un véritable list vous devrez envelopper l'appel dans la balise list constructeur.

4voto

chown Points 25161

En fait, je viens de comprendre :

In [20]: some_list[::len(some_list) - 1]
Out[20]: ['1', 'F']

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