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]]
1
arsenal88 8 oct. 2019 a las 12:48

4 respuestas

La mejor respuesta

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.

1
tobias_k 8 oct. 2019 a las 10:07

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

0
Alex Leymarie 8 oct. 2019 a las 09:57

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!

0
Bharat Gera 8 oct. 2019 a las 10:04

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]]
0
Mykola Zotko 8 oct. 2019 a las 11:12
58283966