Eliminar las listas de una lista que están duplicadas para algunos artículos

Estoy tratando de eliminar las listas de una lista que tiene los mismos elementos primero y tercero, pero solo conservando el primero. Ejemplo de lista y salida:

li=[ [2,4,5], [1,3,5], [1,6,5] ] output_list = [ [2,4,5], [1,3,5] ] 

El código que he escrito tarda mucho tiempo en ejecutarse, ya que la lista original contiene millones de listas.

 b_li = [] output_list = [] for x in li: s = [ x[0], x[2] ] if s not in b_li: b_li.append(s) output_list.append(x) 

¿Cómo puedo mejorar el código? Gracias por adelantado.

Una versión mejorada:

 b_li = set() output_list = [] b_li_add = b_li.add output_list_append = output_list.append for x in li: s = (x[0], x[2]) if s not in b_li: b_li_add(s) output_list_append(x) 

Los cambios son:

  • Use un set() para b_li que hace que las búsquedas sean más rápidas.
  • Convierta s en una tupla, ya que no es necesario almacenar el primer y tercer elementos únicos como listas.
  • Búsquedas de funciones reducidas que también aceleran el código.

Utilice un conjunto para almacenar los elementos vistos. Eso es más rápido:

 seen = set() res = [] for entry in li: cond = (entry[0], entry[2]) if cond not in seen: res.append(entry) seen.add(cond) [[2, 4, 5], [1, 3, 5]] 

ADICIÓN

Además, el tiempo dedicado a pensar en decir nombres de variables suele ser una buena inversión. A menudo, las cosas primero como soluciones desechables permanecen mucho más tiempo de lo previsto.

Aprovechando OrderedDict y el hecho de que los diccionarios tienen claves únicas.

 >>> from collections import OrderedDict >>> li=[ [2,4,5], [1,3,5], [1,6,5] ] >>> OrderedDict(((x[0], x[2]), x) for x in reversed(li)).values() [[1, 3, 5], [2, 4, 5]] 

Esta es una solución basada en el comentario del iterador de @iurisilvio y que utiliza itertools.compress junto con las soluciones basadas en set de las otras. En lugar de crear una output_list de output_list partir de elementos en la lista de entrada, una lista de selector comprende valores booleanos se construye sobre una base: una con respecto a los elementos de la lista de entrada. Un valor de True indica que el elemento correspondiente de la lista de entrada debe mantenerse en la salida. El selector se puede aplicar a la lista de entrada a través de itertools.compress para itertools.compress una salida iterable.

 from itertools import compress li=[ [2,4,5], [1,3,5], [1,6,5] ] b_li = set() selectors = [] for x in li: s = (x[0], x[2]) if s not in b_li: b_li.add(s) selectors.append(True) else: selectors.append(False) for x in compress(li, selectors): print x [2, 4, 5] [1, 3, 5]