Extraer elementos de lista en posiciones impares.

Así que quiero crear una lista que es una lista secundaria de alguna lista existente.

Por ejemplo,

L = [1, 2, 3, 4, 5, 6, 7] , quiero crear una sublista li tal que li contenga todos los elementos en L en posiciones impares.

Mientras puedo hacerlo por

 L = [1, 2, 3, 4, 5, 6, 7] li = [] count = 0 for i in L: if count % 2 == 1: li.append(i) count += 1 

Pero quiero saber si hay otra manera de hacer lo mismo de manera eficiente y en menos pasos.

Solución

Sí tu puedes:

 l = L[1::2] 

Y esto es todo. El resultado contendrá los elementos ubicados en las siguientes posiciones (basado en 0 , por lo que el primer elemento está en la posición 0 , el segundo en 1 etc.):

 1, 3, 5 

entonces el resultado (números reales) será:

 2, 4, 6 

Explicación

El [1::2] al final es solo una notación para el corte de la lista. Normalmente se encuentra en la siguiente forma:

 some_list[start:stop:step] 

Si omitimos el start , se usaría el valor predeterminado ( 0 ). Por lo tanto, se seleccionará el primer elemento (en la posición 0 , porque los índices están basados ​​en 0 ). En este caso se seleccionará el segundo elemento.

Debido a que se omite el segundo elemento, se está utilizando el valor predeterminado (el final de la lista). Así que la lista está siendo iterada desde el segundo elemento hasta el final .

También proporcionamos el tercer argumento ( step ) que es 2 . Lo que significa que se seleccionará un elemento, se saltará el siguiente, y así sucesivamente …

Entonces, para resumir, en este caso [1::2] significa:

  1. toma el segundo elemento (que, por cierto, es un elemento extraño, si juzgas por el índice),
  2. omitir un elemento (porque tenemos el step=2 , por lo que estamos omitiendo uno, como contrario al step=1 que es el predeterminado),
  3. toma el siguiente elemento,
  4. Repita los pasos 2.-3. hasta llegar al final de la lista,

EDITAR : @PreetKukreti dio un enlace para otra explicación sobre la notación de corte de la lista de Python. Vea aquí: Explique la notación de corte de Python.

Extras – sustituyendo contador por enumerate()

En su código, crea y aumenta explícitamente el contador. En Python, esto no es necesario, ya que puede enumerar a través de algún iterable usando enumerate() :

 for count, i in enumerate(L): if count % 2 == 1: l.append(i) 

Lo anterior cumple exactamente el mismo propósito que el código que estaba utilizando:

 count = 0 for i in L: if count % 2 == 1: l.append(i) count += 1 

Más sobre la emulación for bucles con contador en Python: acceso al índice en los bucles ‘para’ de Python

Para las posiciones impares , probablemente quieras:

 >>>> list_ = list(range(10)) >>>> print list_[1::2] [1, 3, 5, 7, 9] >>>> 

Me gustan las comprensiones de listas debido a su syntax matemática (conjunto). Entonces, ¿qué tal esto?

 L = [1, 2, 3, 4, 5, 6, 7] odd_numbers = [y for x,y in enumerate(L) if x%2 != 0] even_numbers = [y for x,y in enumerate(L) if x%2 == 0] 

Básicamente, si enumera en una lista, obtendrá el índice x el valor y . Lo que estoy haciendo aquí es poner el valor y en la lista de salida (par o impar) y usar el índice x para averiguar si ese punto es impar ( x%2 != 0 ).