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

Come posso controllare solo gli elementi di questo elenco con una seconda voce univoca (colonna? Elemento?), Quindi prendere la prima voce trovata nell'elenco. uscita desiderata èOttieni tuple uniche da List, Python

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

Cambia ('tre', 'c') in ('tre', 'a') nell'esempio su l output. – clopez

risposta

15

utilizzare un set (se il secondo articolo è hash-grado):

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

Il codice sopra è equivalente a:

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

Capisco finalmente questa comprensione della lista. Il codice "seen.add()" restituisce sempre None, quindi pronunciare "e non ... sempre None" non è una condizione da verificare, solo un modo per introdurre un comando nella comprensione della lista. – appleLover

2

Se l'ordine non è importante, è possibile utilizzare un dizionario:

d = {} 

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

print d.values() 

o più conciso:

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

Se non si inverte la lista, ('three', 'a') sovrascriverà ('one', 'a').