Tengo una lista anidada como ejemplo:
lst_a = [[1,2,3,5], [1,2,3,7], [1,2,3,9], [1,2,6,8]]
Estoy tratando de verificar si los primeros 3 índices de un elemento de lista anidada son los mismos que otros.
Es decir.
Si [1,2,3] existe en otras listas, elimine todos los demás elementos de la lista anidada que lo contengan. Para que la lista anidada sea única.
No estoy seguro de que la forma más pitónica de hacerlo sea.
for i in range(0, len(lst_a)):
if lst[i][:3] == lst[i-1][:3]:
lst[i].pop()
Salida deseada:
lst_a = [[1,2,3,9], [1,2,6,8]]
4 respuestas
Si, como dijiste en los comentarios, las sublistas que tienen los mismos primeros tres elementos siempre están una al lado de la otra (pero la lista no está necesariamente ordenada) puedes usar itertools.groupby
para agrupar esos elementos y luego obtener {{X1 }} de cada uno de los grupos.
>>> from itertools import groupby
>>> lst_a = [[1,2,3,5], [1,2,3,7], [1,2,3,9], [1,2,6,8]]
>>> [next(g) for k, g in groupby(lst_a, key=lambda x: x[:3])]
[[1, 2, 3, 5], [1, 2, 6, 8]]
O utilice una lista de comprensión con enumerate
y compare el elemento actual con el último:
>>> [x for i, x in enumerate(lst_a) if i == 0 or lst_a[i-1][:3] != x[:3]]
[[1, 2, 3, 5], [1, 2, 6, 8]]
Esto no requiere ninguna importación, pero en mi humilde opinión cuando se usa groupby
es mucho más claro lo que se supone que debe hacer el código. Sin embargo, tenga en cuenta que, a diferencia de su método, ambos crearán una lista filtrada nueva , en lugar de actualizar / eliminar de la lista original.
Creo que le falta un bucle For
si desea verificar todas las posibilidades. Supongo que debería gustar:
for i in range(0, len(lst_a)):
for j in range(i, len(lst_a)):
if lst[i][:3] == lst[j][:3]:
lst[i].pop()
Tal vez no sea la mejor idea eliminar al recorrer la lista, ya que debería eliminar los elementos no deseados al final
Siguiendo su enfoque, encuentre el siguiente código:
lst=[lst_a[0]]
for li in lst_a[1:]:
if li[:3]!=lst[0][:3]:
lst.append(li)
print(lst)
¡Espero que esto ayude!
Puede usar un diccionario para filtrar una lista:
dct = {tuple(i[:3]): i for i in lst}
# {(1, 2, 3): [1, 2, 3, 9], (1, 2, 6): [1, 2, 6, 8]}
list(dct.values())
# [[1, 2, 3, 9], [1, 2, 6, 8]]
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.