2013-09-05 43 views
11
>>> a= ('one', 'a') 
>>> b = ('two', 'b') 
>>> c = ('three', 'a') 
>>> l = [a, b, c] 
>>> l 
[('one', 'a'), ('two', 'b'), ('three', 'a')] 

Làm cách nào tôi chỉ kiểm tra các thành phần của danh sách này với mục nhập thứ hai duy nhất (cột? Mục?) Rồi lấy mục nhập đầu tiên được tìm thấy trong danh sách. đầu ra mong muốn đượcLấy Tuples độc đáo từ Danh sách, Python

>>> l 
[('one', 'a'), ('two', 'b')] 
+0

Thay đổi ('ba', 'c') thành ('ba', 'a') trên ví dụ về đầu ra l. – clopez

Trả lời

15

Sử dụng một bộ (nếu mục thứ hai là hash-thể):

>>> lis = [('one', 'a'), ('two', 'b'), ('three', 'a')] 
>>> seen = set() 
>>> [item for item in lis if item[1] not in seen and not seen.add(item[1])] 
[('one', 'a'), ('two', 'b')] 

Đoạn mã trên tương đương với:

>>> seen = set() 
>>> ans = [] 
for item in lis: 
    if item[1] not in seen: 
     ans.append(item) 
     seen.add(item[1]) 
...   
>>> ans 
[('one', 'a'), ('two', 'b')] 
+2

Cuối cùng tôi đã hiểu được việc hiểu danh sách này. Mã "seen.add()" luôn trả về None, do đó, nói "and not ... always None" không phải là điều kiện để kiểm tra, chỉ là một cách để lén một lệnh vào danh sách hiểu. – appleLover

2

Nếu trật tự không phải là quan trọng, bạn có thể sử dụng từ điển:

d = {} 

for t in reversed(l): 
    d[t[1]] = t 

print d.values() 

Hay chính xác hơn:

{t[1]: t for t in reversed(l)}.values() 

Nếu bạn không đảo ngược danh sách, ('three', 'a') sẽ ghi đè lên ('one', 'a').