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]: []
...
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]]
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')
, Vous pouvez le faire comme ceci:
some_list[0::len(some_list)-1]
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.
Et ça?
>>> first_element, last_element = some_list[0], some_list[-1]
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
).
En fait, je viens de le comprendre:
In [20]: some_list[::len(some_list) - 1]
Out[20]: ['1', 'F']
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.
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.
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]
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)