2012-08-31 30 views
39

¿Hay alguna forma de dividir solo el primer y el último elemento de una lista?Python slice primer y último elemento en la lista

Por ejemplo; Si esta es mi lista:

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

I quiero para hacer esto (obviamente [0,-1] no es una sintaxis válida):

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

Algunas cosas que he intentado:

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]: [] 
... 
+5

Jaja 3 respuestas, idénticas, en el lapso de 2 segundos, y uno era el suyo. Clásico. – Aesthete

+3

¿Qué tiene de malo 'first, last = some_list [0], some_list [-1]'? –

+0

@MatthewAdams Porque lo estoy dividiendo en la misma línea, y eso tendría que perder tiempo dividiéndolo dos veces: 'x, y = a.split (" - ") [0], a.split (" - ") [ -1] '. – chown

Respuesta

60

Una manera:

some_list[::len(some_list)-1] 

Una mejor manera (no usa rebanar, pero es más fácil de leer):

[some_list[0], some_list[-1]] 
+14

La segunda forma es * mucho * más legible. Explícito es mejor que implícito de nuevo. –

+3

De ahí la "posiblemente una mejor manera". la única razón por la que no lo puse en primer lugar es porque la pregunta pide explícitamente un "corte" y la segunda forma no es técnicamente un corte ... – mgilson

+2

Nunca es demasiado tarde para educar al OP sobre la locura de sus maneras. :-P –

6

You puede hacerlo así:

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

realidad, sólo lo descubrió:

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

¿Qué tal esto?

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

Simplemente pensé que había muestro cómo hacer esto con la indexación de fantasía de numpy:

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

Tenga en cuenta que también es compatible con las ubicaciones de índice arbitrarios, que el método [::len(some_list)-1] no funcionaría para:

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

Como señala DSM, puede hacer algo similar con itemgetter:

>>> import operator 
>>> operator.itemgetter(0, 2, -1)(some_list) 
('1', '3', 'F') 
+2

Numpy es simplemente demasiado impresionante ... – mgilson

+0

numpy por lo general me hace sonreír! – jterrace

+3

Puede obtener una variante de esto para trabajar usando 'itemgetter' sin' numpy': 'itemgetter (0, -1) (some_list)'. – DSM

4

Algunas personas están respondiendo la pregunta incorrecta, al parecer. Usted dijo que desea hacer:

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

Es decir, desea extraer el primer y último elemento cada uno en variables separadas.

En este caso, las respuestas de Matthew Adams, pemistahl y katrielalex son válidas. Esto es sólo una asignación compuesta:

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

Pero más tarde que indicar una complicación: "Estoy partiéndolo en la misma línea, y que tendría que pasar tiempo dividiéndolo en dos ocasiones:"

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

Por lo tanto, para evitar dos llamadas split(), solo debe operar en la lista que resulta de dividir una vez.

En este caso, intentar hacer demasiado en una línea va en detrimento de la claridad y la simplicidad.Utilizar una variable para contener el resultado de división: "¿cómo obtener una nueva lista, que consta de los elementos primero y último de una lista"

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

Otras respuestas respondieron a la pregunta de Probablemente fueron inspirados por su título, que menciona rebanar, que en realidad no desea, según una lectura cuidadosa de su pregunta.

yo sepa son 3 maneras de obtener una nueva lista con el 0th y los elementos últimos de una lista:

>>> 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'] 

La ventaja del enfoque de lista por comprensión, es que el conjunto de índices en la tupla puede ser arbitraria y generado programáticamente

1

se puede usar algo como `

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

si realmente desea utilizar rebanar. La ventaja de esto es que no puede dar errores de índice y funciona con listas de longitud 1 o 0 también.

0

Esto no es un "sector", pero es una solución general que no utiliza indexación explícita, y funciona para el escenario donde la secuencia en cuestión es anónima (para que pueda crear y "cortar" en el misma línea, sin necesidad de crear dos veces y dos veces la indexación): operator.itemgetter

import operator 

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

... 

first, last = first_and_last(some_list) 

se podía inline como (después from operator import itemgetter por brevedad en el momento de su uso):

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

pero si usted va a reutilizar obtener mucho, puede guardar el trabajo de recrearlo (una d darle un nombre útil y autodocumentado) al crearlo una vez por adelantado.

Por lo tanto, para su caso de uso específico, se puede reemplazar:

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

con:

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

y split una sola vez sin almacenar la completa list en un nombre persistente para len de cheques o doble -indexing o similar.

Tenga en cuenta que itemgetter por varios elementos, devuelve un tuple, no un list, por lo que si usted no está solo al sacarlo a nombres específicos, y necesita un cierto list, habría que concluir la llamada en el list constructor.

0

Python 3 única respuesta (que no utiliza rebanar o tirar el resto de la list, pero podría ser lo suficientemente bueno de todos modos) es el uso de desembalar generalizaciones para obtener first y last separado del medio:

first, *_, last = some_list 

La elección de _ como cadena de caracteres para el "resto" de los argumentos es arbitraria; se almacenarán en el nombre _ que a menudo se usa como sustituto de "cosas que no me importan".

A diferencia de muchas otras soluciones, esta se asegurará de que haya al menos dos elementos en la secuencia; si solo hay uno (entonces first y last serían idénticos), se generará una excepción (ValueError).

0

caso más general: Retorno N puntos de cada extremo de la lista

Las respuestas trabajan por primera específica y por último, pero algunos, como yo, se puede buscar una solución que se puede aplicar a una caso más general en el que se puede devolver los puntos principales N desde ambos lados de la lista (que usted tiene una lista ordenada y sólo desea que el 5 más alto o más bajo), se me ocurrió la siguiente solución:

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 

y un ejemplo para devolver 3 números de la lista 1-10:

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

#Out[2] 
#[1, 2, 3, 8, 9, 10] 
-2
def recall(x): 
    num1 = x[-4:] 
    num2 = x[::-1] 
    num3 = num2[-4:] 
    num4 = [num3, num1] 
    return num4 

Ahora acaba de hacer una variable fuera de la función y el recuerdo de la función: como esto:

avg = recall("idreesjaneqand") 
print(avg) 
Cuestiones relacionadas