Tranche Python premier et dernier élément dans la liste

Existe-t-il un moyen de dé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']

Je veux que le fasse (é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]: []
...
45
demandé sur chown 2012-08-31 19:54:40

13 réponses

Une façon:

some_list[::len(some_list)-1]

Une meilleure façon (n'utilise pas le découpage, mais est plus facile à lire):

[some_list[0], some_list[-1]]
72
répondu mgilson 2012-08-31 15:57:07

Je pensais juste montrer comment faire cela avec l'indexation de fantaisie de numpy:

>>> import numpy
>>> some_list = ['1', 'B', '3', 'D', '5', 'F']
>>> numpy.array(some_list)[[0,-1]]
array(['1', 'F'], 
      dtype='|S1')

Notez qu'il prend également en charge les emplacements d'index arbitraires, pour lesquels la méthode [::len(some_list)-1] ne fonctionnerait pas:

>>> numpy.array(some_list)[[0,2,-1]]
array(['1', '3', 'F'], 
      dtype='|S1')

Comme le souligne DSM, vous pouvez faire quelque chose de similaire avec itemgetter :

>>> import operator
>>> operator.itemgetter(0, 2, -1)(some_list)
('1', '3', 'F')
11
répondu jterrace 2012-08-31 16:10:12
first, last = some_list[0], some_list[-1]
7
répondu Katriel 2012-08-31 15:58:48

, Vous pouvez le faire comme ceci:

some_list[0::len(some_list)-1]
6
répondu Oleh Prypin 2012-08-31 15:56:55

Certaines personnes répondent à la mauvaise question, semble-t-il. Vous avez dit que vous voulez faire:

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

Ie., vous souhaitez extraire les premier et dernier éléments chacun dans des variables distinctes.

Dans ce cas, les réponses de Matthew Adams, pemistahl et katrielalex sont valides. Ceci est juste une affectation composée:

first_item, last_item = some_list[0], some_list[-1]

Mais plus tard, vous déclarez une complication: "je le divise dans la même ligne, et cela devrait passer du temps à le diviser deux fois:"

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

Donc pour évitez deux appels split (), vous ne devez opérer que sur la liste qui résulte du fractionnement une fois.

Dans ce cas, tenter d'en faire trop en une seule ligne nuit à la clarté et à la simplicité. Utilisez une variable pour contenir le résultat du fractionnement:

lst = a.split("-")
first_item, last_item = lst[0], lst[-1]

D'autres réponses ont répondu à la question de " comment obtenir une nouvelle liste, composée des premier et dernier éléments d'une liste?"Ils ont probablement été inspirés par votre titre, qui mentionne le tranchage, que vous ne voulez pas, selon un lecture attentive de votre question.

AFAIK sont 3 façons d'obtenir une nouvelle liste avec le 0ème et le dernier élément d'une liste:

>>> s = 'Python ver. 3.4'
>>> a = s.split()
>>> a
['Python', 'ver.', '3.4']

>>> [ a[0], a[-1] ]        # mentioned above
['Python', '3.4']

>>> a[::len(a)-1]          # also mentioned above
['Python', '3.4']

>>> [ a[e] for e in (0,-1) ] # list comprehension, nobody mentioned?
['Python', '3.4']

# Or, if you insist on doing it in one line:
>>> [ s.split()[e] for e in (0,-1) ]
['Python', '3.4']

L'avantage de l'approche de compréhension de liste, est que l'ensemble des indices dans le tuple peut être arbitraire et généré par programme.

6
répondu crobc1 2015-08-29 21:54:31

Et ça?

>>> first_element, last_element = some_list[0], some_list[-1]
5
répondu pemistahl 2012-08-31 15:58:19

Python 3 seule réponse (qui n'utilise pas le découpage ou jette le reste du list, mais pourrait être assez bon de toute façon) est d'utiliser des généralisations de déballage pour obtenir first et last séparés du milieu:

first, *_, last = some_list

Le choix de _ comme catchall pour le "reste" des arguments est arbitraire; ils seront stockés dans le nom _ qui est souvent utilisé comme un remplaçant pour "des choses dont je ne me soucie pas".

Contrairement à beaucoup d'autres solutions, celle-ci assurera qu'il y en a au moins deux éléments de la séquence; s'il n'y en a qu'un (donc first et last seraient identiques), il déclenchera une exception (ValueError).

4
répondu ShadowRanger 2017-04-17 12:32:42

En fait, je viens de le comprendre:

In [20]: some_list[::len(some_list) - 1]
Out[20]: ['1', 'F']
3
répondu chown 2012-08-31 15:57:13

Vous pouvez utiliser quelque chose comme

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

Si vous voulez vraiment utiliser le tranchage. L'avantage de ceci est qu'il ne peut pas donner d'erreurs d'index et fonctionne également avec des listes de longueur 1 ou 0.

2
répondu Chiel ten Brinke 2018-08-16 07:49:12

Ce n'est pas une "tranche" , mais c'est une solution générale qui n'utilise pas d'indexation explicite, et fonctionne pour le scénario où la séquence en question Est anonyme (donc vous pouvez 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 pouvez simplement l'intégrer comme (après from operator import itemgetter pour plus de concision au moment de l'utilisation):

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

Mais si vous réutilisez beaucoup le getter, vous pouvez enregistrer le travail de le recréer (et lui donner un utile, nom Auto-documentant) en le créant une fois à l'avance.

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

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

Avec:

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

Et split une seule fois sans stocker le list complet dans un nom persistant pour len vérification ou double-indexation ou similaire.

Remarque que itemgetter pour plusieurs articles retourne un tuple, pas list, donc si vous n'êtes pas seulement le déballage de noms spécifiques, et ont besoin d'un vrai list, vous auriez à encapsuler l'appel dans le list constructeur.

0
répondu ShadowRanger 2017-04-17 12:18:03

Cas plus général: renvoie N points de chaque fin de liste

Les réponses fonctionnent pour le premier et le dernier spécifique, mais certains, comme moi, peuvent être à la recherche d'une solution qui peut être appliquée à un cas plus général dans lequel vous pouvez retourner les N premiers points de chaque côté de la liste (disons que vous avez une liste triée et que vous voulez seulement les 5 plus haut ou]}

In [1]
def GetWings(inlist,winglen):
    if len(inlist)<=winglen*2:
        outlist=inlist
    else:
        outlist=list(inlist[:winglen])
        outlist.extend(list(inlist[-winglen:]))
    return outlist

Et un exemple pour retourner les 3 numéros du bas et du haut de la liste 1-10:

In [2]
GetWings([1,2,3,4,5,6,7,8,9,10],3)

#Out[2]
#[1, 2, 3, 8, 9, 10]
0
répondu Vlox 2017-04-28 14:49:08

J'ai trouvé que cela pourrait faire ceci:

list[[0,-1]]
-2
répondu Ye Zhuo 2018-03-21 01:58:10
def recall(x): 
    num1 = x[-4:]
    num2 = x[::-1]
    num3 = num2[-4:]
    num4 = [num3, num1]
    return num4

Maintenant juste faire une variable en dehors de la fonction et de rappeler la fonction : comme ceci:

avg = recall("idreesjaneqand") 
print(avg)
-3
répondu MIIK7 2017-06-14 05:27:22