2012-03-30 19 views
7

Gegeben eine Liste Ich muss eine Liste von Listen von einzigartigen Gegenständen zurückgeben. Ich bin auf der Suche, um zu sehen, ob es ein Pythonic Weg ist, als das, was ich kam mit:Eindeutige Listen von einer Liste

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])) 

Ausgang:

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

Danke für Counter, groupby und defaultdict Lösungen! Ich habe heute etwas Neues gelernt. –

Antwort

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

Ich habe ursprünglich eine Lösung geschrieben, die eine Zeile kürzer war, indem ich einfach die eingebaute Count-Methode der Liste verwendete, aber gnibbler macht den ausgezeichneten Punkt, dass list.count() O (n) ist, was meinen Algorithmus O (n^2) macht. +1 –

+3

Es gibt keinen Grund, dass die Erstellung des 'Counter' hier nicht in das Listenverständnis gefaltet werden kann:' [[k] * v für k, v in Counter (L) .items()] '. –

+0

@Karl, ich stimme zu, ich glaube nicht, dass es weniger lesenswert ist –

2

Verwenden von Standard dict.

>>> 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

finde ich die Build-in-Funktion set() nützlich sehr oft:

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]] 
Verwandte Themen