2009-07-17 73 views
10

Có thể ai đề xuất một giải pháp tốt để xóa các bản sao khỏi danh sách lồng nhau nếu muốn đánh giá các bản sao dựa trên phần tử đầu tiên của mỗi danh sách lồng nhau không?Xóa các bản sao khỏi danh sách các danh sách trong Python

Danh sách chính trông như thế này:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]] 

Nếu có một danh sách với cùng một nguyên tố ở vị trí đầu tiên [k][0] rằng đã xảy ra, sau đó tôi muốn xoá danh sách đó và có được kết quả này:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33]] 

Bạn có thể đề xuất thuật toán để đạt được mục tiêu này không?

Trả lời

28

Bạn có quan tâm đến việc bảo quản thứ tự/sao chép bị xóa? Nếu không, sau đó:

dict((x[0], x) for x in L).values() 

sẽ làm điều đó. Nếu bạn muốn giữ gìn trật tự, và muốn giữ cái đầu tiên bạn tìm thấy sau đó:

def unique_items(L): 
    found = set() 
    for item in L: 
     if item[0] not in found: 
      yield item 
      found.add(item[0]) 

print list(unique_items(L)) 
+0

chuyển đổi của bạn thành một dict được nhiều hơn nữa thanh lịch hơn so với tâm trí mà tôi đã đánh cắp nó :) – Jiaaro

+0

* hơn MINE (Tôi thực sự muốn tôi có thể chỉnh sửa một bình luận) – Jiaaro

0

tôi không chắc chắn những gì bạn có nghĩa là bởi "danh sách khác", vì vậy tôi giả sử bạn đang nói đến những danh sách bên L

a=[] 
L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']] 
for item in L: 
    if not item[0] in a: 
     a.append(item[0]) 
     print item 
+0

này sẽ hiệu quả hơn nếu bạn sử dụng một tập cho 'a' - bạn O (N^2) sử dụng một danh sách như thế, và phân bổ O (N) bằng cách sử dụng một tập hợp. – RichieHindle

+0

đã không đến với tâm trí, cảm ơn thông tin. tuy nhiên, mã đó hoạt động trong phiên bản Python cũ hơn không có sẵn. ;) – ghostdog74

3

sử dụng một dict thay vì như vậy:

L = {'14': ['65', 76], '2': ['5', 6], '7': ['12', 33]} 
L['14'] = ['22', 46] 

nếu bạn đang nhận danh sách đầu tiên từ một số nguồn bên ngoài, chuyển đổi danh sách đó như sau:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]] 
L_dict = dict((x[0], x[1:]) for x in L) 
0

Nếu thứ tự không quan trọng, mã dưới đây

print [ [k] + v for (k, v) in dict([ [a[0], a[1:]] for a in reversed(L) ]).items() ] 

cho

[[ '2', '5', '6'], ['14', '65', '76'], ['7', '12', '33']]

0

Sử dụng gấu trúc:

import pandas as pd 

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']] 

df = pd.DataFrame(L) 
df = df.drop_duplicates() 

L_no_duplicates = df.values.tolist() 

Nếu bạn muốn thả bản sao trong cột cụ thể chỉ sử dụng thay vì:

df = df.drop_duplicates([1,2]) 
Các vấn đề liên quan