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

Jak mogę sprawdzić tylko elementy tej listy z unikatowym drugim wpisem (kolumna? Element?), A następnie pobrać pierwszy wpis znaleziony na liście. Pożądany wyjścieUzyskaj unikalne krotki z listy, Python

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

Zmiana ("trzy", "c") na ("trzy", "a") w przykładzie na wyjściu l. – clopez

Odpowiedz

15

Użyj zestawu (jeśli druga pozycja jest hash-stanie):

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

Powyższy kod jest równoważny:

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

W końcu rozumiem tę listę rozumienia. Kod "seen.add()" zawsze zwraca None, więc wypowiadanie "and not ... always None" nie jest warunkiem do sprawdzenia w ogóle, tylko sposobem na przekreślenie polecenia do listy. – appleLover

2

Jeśli zamówienie nie jest ważne, możesz użyć słownika:

d = {} 

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

print d.values() 

lub bardziej zwięźle:

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

Jeśli nie odwrócić listę ('three', 'a') zastąpi ('one', 'a').