Estoy buscando una manera de dividir fácilmente una lista de Python por la mitad.
Entonces, si tengo una matriz:
A = [0,1,2,3,4,5]
Yo podría obtener:
B = [0,1,2]
C = [3,4,5]
A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]
Si quieres una función:
def split_list(a_list):
half = len(a_list)//2
return a_list[:half], a_list[half:]
A = [1,2,3,4,5,6]
B, C = split_list(A)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
Una solución un poco más genérica (puede especificar la cantidad de partes que desea, no solo dividir 'a la mitad'):
EDITAR : publicación actualizada para manejar longitudes de lista impares
EDIT2 : actualizar la publicación nuevamente según los comentarios informativos de Brians
fuente
//
significa división entera. No deben dejarse de lado ya que son bastante esenciales para que esto funcione.n
- la longitud predefinida de las matrices de resultadosfuente
Prueba:
resultado:
fuente
for i,j in zip(list,lengths): print(split(i,j))
. Las listaslist
ylengths
tienen la misma longitud. j es alternativo: 5,4,5,4,5, y la función de división funciona en las dos primeras alternancias, es decir, divide el primeroi
de la lista por 5 y 4, PERO en la siguiente iteración lo divide en 4,4, 1) : \ Responda si desea que le explique más (publique una nueva pregunta)Si no te importa el pedido ...
list[::2]
obtiene cada segundo elemento de la lista a partir del elemento 0.list[1::2]
obtiene cada segundo elemento de la lista a partir del primer elemento.fuente
list
con sombrear ellist(...)
incorporado. Lo he vistolst
ylist_
usado comúnmente para evitarlo.B,C=A[:len(A)/2],A[len(A)/2:]
fuente
Aquí hay una solución común, dividir arr en parte de conteo
fuente
Probé, y se requiere la doble barra para forzar la división int en python 3. Mi publicación original fue correcta, aunque wysiwyg se rompió en Opera, por alguna razón.
fuente
Hay una receta oficial de Python para el caso más generalizado de dividir una matriz en matrices más pequeñas de tamaño
n
.Este fragmento de código es de la página del documento de itertools de Python .
fuente
Usando el corte de la lista . La sintaxis es básicamente
my_list[start_index:end_index]
Para obtener la primera mitad de la lista, se divide desde el primer índice hasta
len(i)//2
(donde//
está la división de enteros, entonces3//2 will give the floored result of
1, instead of the invalid list index of
1.5`):..y el intercambio de los valores para obtener la segunda mitad:
fuente
3//2
muestra el resultado1
, entonces da , entonces obtienesi[:1]
cuál te da[0]
yi[1:]
qué da[1, 2]
Si tiene una lista grande, es mejor usar itertools y escribir una función para obtener cada parte según sea necesario:
Puedes usar esto como:
El resultado es:
Gracias a @thefourtheye y @Bede Constantinides
fuente
10 años después ... pensé, ¿por qué no agregar otro?
fuente
Si bien las respuestas anteriores son más o menos correctas, puede tener problemas si el tamaño de su matriz no es divisible por 2, como resultado de que
a / 2
, siendo extraño, es flotante en Python 3.0, y en una versión anterior si especifiquefrom __future__ import division
al comienzo de su script. En cualquier caso, es mejor optar por la división de enteros, es decira // 2
, para obtener compatibilidad "hacia adelante" de su código.fuente
Esto es similar a otras soluciones, pero un poco más rápido.
fuente
Con pistas de @ChristopheD
fuente
fuente
Otra visión de este problema en 2020 ... Aquí hay una generalización del problema. Interpreto que 'divide una lista por la mitad' es ... (es decir, solo dos listas y no habrá derrame a una tercera matriz en caso de que haya una extraña, etc.). Por ejemplo, si la longitud de la matriz es 19 y una división entre dos usando // operador da 9, y terminaremos teniendo dos matrices de longitud 9 y una matriz (tercera) de longitud 1 (en total tres matrices). Si quisiéramos una solución general para dar dos matrices todo el tiempo, asumiré que estamos contentos con las matrices dúo resultantes que no tienen la misma longitud (una será más larga que la otra). Y que se supone que está bien tener el orden mezclado (alternando en este caso).
Este concepto funciona para cualquier cantidad de partición de la lista que desee (tendría que ajustar el código dependiendo de cuántas partes de la lista desee). Y es bastante sencillo de interpretar. Para acelerar las cosas, incluso puede escribir este bucle en cython / C / C ++ para acelerar las cosas. Por otra parte, probé este código en listas relativamente pequeñas ~ 10,000 filas y termina en una fracción de segundo.
Solo mis dos centavos.
¡Gracias!
fuente