2010-10-05 20 views
9

Tengo varias listas largas en python y las comparo y encuentro las listas que son iguales entre ellas, excepto los últimos elementos en ellas. ¿Cuál es la manera más rápida?Comparación de listas de Python

+0

¿Desea excluir el último elemento de cada lista o buscar prefijos comunes? –

Respuesta

8

Use algo como if list1[:-1] == list2[:-1].

14

a[:-1] es la abreviatura de "todos los elementos de a pero el último". Si necesita que se excluya más de 1 elemento, cambie el 1 al número que necesita.

a[:-1] == b[:-1] compararán a y b sin sus elementos finales.

Consulte this para obtener más información sobre rebanar.

1

para comparar dos listas, creo que algo así iba a evitar copiar cualquier parte de sus listas, y se detiene tan pronto como una falta de coincidencia se encuentra:

len(a)==len(b) and all(a[i] == b[i] for i in range(len(a)-1)) 

para encontrar todos los partidos en un conjunto arbitrario de las listas , Creo que necesitaría comparar cada par de listas, o al menos, cada par que no haya comprobado alguna versión equivalente de (por ejemplo, si A = B y B = C, no es necesario verificar A = C). No sé de un algoritmo que lo haga simple.

Alternativamente, si las listas son escandalosamente largas y quiere evitar atravesarlas, podría calcular una suma de comprobación de los primeros elementos N-1 de cada una, y luego simplemente comparar las sumas de comprobación.

+1

¿Cómo evitaría el cálculo de una suma de comprobación atravesar las listas? – nmichaels

+0

Si necesita comparar todas las listas entre sí, está viendo N * (N-1)/2 cruces de lista. Si calcula hashes para cada uno, solo tiene N transversals de las listas originales. Dependiendo de la cantidad de listas "varias" y de la duración de las "listas largas", ¡eso podría evitar una gran cantidad de atravesamientos! Siempre que la suma de comprobación sea lo suficientemente buena, de todos modos. – Ken

+0

Esta respuesta podría potencialmente comparar cada elemento de una lista con otro de la misma longitud, no todos excepto el último elemento, por lo que no aborda la pregunta. – martineau