2012-03-30 13 views
7

Dada una lista, debo devolver una lista de listas de elementos únicos. Estoy mirando para ver si hay una manera más Pythonic de lo que ocurrió:Listas únicas de una lista

def unique_lists(l): 
    m = {} 
    for x in l: 
     m[x] = (m[x] if m.get(x) != None else []) + [x] 
    return [x for x in m.values()]  

print(unique_lists([1,2,2,3,4,5,5,5,6,7,8,8,9])) 

Salida:

[[1], [2, 2], [3], [4], [5, 5, 5], [6], [7], [8, 8], [9]] 
+0

Gracias por Contador, soluciones GroupBy y defaultdict! Aprendí algo nuevo hoy. –

Respuesta

9
>>> L=[1,2,2,3,4,5,5,5,6,7,8,8,9] 
>>> from collections import Counter 
>>> [[k]*v for k,v in Counter(L).items()] 
[[1], [2, 2], [3], [4], [5, 5, 5], [6], [7], [8, 8], [9]] 
+1

Originalmente publiqué una solución que era una línea más corta simplemente usando el método de recuento integrado de la lista, pero gnibbler hace el excelente punto de que list.count() es O (n), lo que hace que mi algoritmo sea O (n^2). +1 –

+3

No hay ninguna razón para que la creación del 'Contador' no se pueda plegar en la lista de comprensión aquí:' [[k] * v para k, v en el contador (L) .sitios()] '. –

+0

@Karl, estoy de acuerdo, no creo que sea menos legible –

2

Usando dict defecto.

>>> from collections import defaultdict 
>>> b = defaultdict(list) 
>>> a = [1,2,2,3,4,5,5,5,6,7,8,8,9] 
>>> for x in a: 
...  b[x].append(x) 
... 
>>> b.values() 
[[1], [2, 2], [3], [4], [5, 5, 5], [6], [7], [8, 8], [9]] 
0

puedo encontrar la estructura en función de set() útil muy a menudo:

lst=[1,2,2,3,4,5,5,5,6,7,8,8,9] 

def all_eq_elms(lst, elm): 
    while True: 
     try: 
      yield lst.pop(lst.index(elm)) 
     except: 
      break 

[[e for e in all_eq_elms(lst,elm)] for elm in set(lst)] 

Out[43]: [[1], [2, 2], [3], [4], [5, 5, 5], [6], [7], [8, 8], [9]] 
Cuestiones relacionadas