Entonces quiero crear una lista que sea una sublista de alguna lista existente.
Por ejemplo,
L = [1, 2, 3, 4, 5, 6, 7]
, Quiero crear una sublista li
que li
contenga todos los elementos en L
posiciones impares.
Mientras puedo hacerlo
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 forma de hacer lo mismo de manera eficiente y en menos pasos.
Respuestas:
Solución
Sí tu puedes:
Y esto es todo. El resultado contendrá los elementos colocados en las siguientes posiciones (
0
basado en, por lo que el primer elemento está en la posición0
, el segundo en,1
etc.):por lo que el resultado (números reales) será:
Explicación
El
[1::2]
al final es solo una notación para dividir la lista. Por lo general, tiene la siguiente forma:Si lo omitimos
start
, se0
usaría el valor predeterminado ( ). Por tanto, se seleccionaría el primer elemento (en la posición0
, porque los índices están0
basados en). En este caso, se seleccionará el segundo elemento.Debido a que se omite el segundo elemento, se utiliza el predeterminado (el final de la lista). Entonces, la lista se itera desde el segundo elemento hasta el final .
También proporcionamos el tercer argumento (
step
) que es2
. Lo que significa que se seleccionará un elemento, se omitirá el siguiente, y así sucesivamente ...Entonces, en resumen, en este caso
[1::2]
significa:step=2
, por lo que estamos omitiendo uno, al contrario de lostep=1
que es predeterminado),EDITAR : @PreetKukreti dio un enlace para otra explicación sobre la notación de corte de lista de Python. Vea aquí: Explica la notación de corte de Python
Extras: reemplazo del mostrador 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 algunos iterables usando
enumerate()
:Lo anterior tiene exactamente el mismo propósito que el código que estaba usando:
Más sobre la emulación de
for
bucles con contador en Python: Accediendo al índice en Python 'for' buclesfuente
(0,2,4,6)
; parece que OP quiere índices(1,3,5)
, que serían dados por[1,2,3,4,5,6,7][1::2]
.1
).list
corte de Python . Difiere un poco, especialmente porque ellist
segmento de 'no guarda referencia a la lista original (en Numarray necesitas llamar explícitamente.copy()
para tener algo que no haga referencia a la matriz original). Pero es bueno tener algo que pueda ser mejor para algunos lectores. ¿Le importaría publicar este enlace en el comentario para que pueda votar y aparecerá justo debajo de la respuesta?Para las posiciones impares , probablemente quieras:
fuente
Me gustan las comprensiones de listas debido a su sintaxis Math (Set). Entonces, ¿qué tal esto?
Básicamente, si enumera sobre una lista, obtendrá el índice
x
y el valory
. Lo que estoy haciendo aquí es poner el valory
en la lista de salida (par o impar) y usar el índicex
para averiguar si ese punto es impar (x%2 != 0
).fuente
Puede hacer uso del operador AND bit a bit
&
. Veamos a continuación:El operador AND bit a bit se usa con 1, y la razón por la que funciona es que, cuando se escribe en binario, un número impar debe tener su primer dígito como 1. Comprobemos
Y la operación con 1 solo devolverá 1 (1 en binario también tendrá el último dígito 1), si el valor es impar.
Consulte la página del operador Bitwise de Python para obtener más información.
PD: puede usar tácticamente este método si desea seleccionar columnas pares e impares en un marco de datos. Digamos que las coordenadas xey de los puntos clave faciales se dan como columnas x1, y1, x2, etc. Para normalizar las coordenadas xey con los valores de ancho y alto de cada imagen, simplemente puede realizar
Esto no está exactamente relacionado con la pregunta, pero para los científicos de datos y los ingenieros de visión por computadora este método podría ser útil.
¡Salud!
fuente
lista_ = lista (rango (9)) imprimir (lista_ [1 :: 2])
fuente