2012-03-30 58 views
7

Đưa ra danh sách Tôi cần trả lại danh sách các mục duy nhất. Tôi đang tìm để xem nếu có một cách Pythonic nhiều hơn những gì tôi đã đưa ra:Danh sách duy nhất từ ​​danh sách

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

Output:

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

Cảm ơn bạn đã truy cập, groupby và defaultdict giải pháp! Tôi đã học được một cái gì đó mới ngày hôm nay. –

Trả lời

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

Ban đầu tôi đăng một giải pháp ngắn hơn một dòng bằng cách sử dụng phương pháp đếm được xây dựng trong danh sách, nhưng gnibbler làm cho điểm tuyệt vời mà list.count() là O (n), làm cho thuật toán O (n^2) của tôi. +1 –

+3

Không có lý do gì mà việc tạo ra 'Counter' không thể được xếp vào danh sách hiểu ở đây:' [[k] * v cho k, v trong Counter (L) .items()] '. –

+0

@Karl, tôi đồng ý, tôi không nghĩ rằng nó ít có thể đọc được –

2

Sử dụng dict mặc định.

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

tôi thấy việc xây dựng trong chức năng set() hữu ích rất thường xuyên:

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]] 
Các vấn đề liên quan