2013-06-27 11 views
11

Ho una lista di oggetti che hanno ciascuno un attributo specifico. Questo attributo non è univoco e mi piacerebbe finire con un elenco degli oggetti che è un sottoinsieme dell'intero elenco, in modo tale che tutti gli attributi specifici siano un insieme unico.Elenco di oggetti con un attributo unico

Per esempio, se ho quattro oggetti:

object1.thing = 1 
object2.thing = 2 
object3.thing = 3 
object4.thing = 2 

vorrei finire con entrambi i

[object1, object2, object3] 

o

[object1, object3, object4] 

Gli oggetti esatte che si snodano in l'elenco finale non è importante, solo che un elenco del loro attributo specifico è unico.

MODIFICA: per chiarire, in sostanza ciò che voglio è un set che è separato da tale specifico attributo.

+1

Eventuali duplicati di [Come arrivare lista unica usando una parola chiave: Python ] (https://stackoverflow.com/questions/10024646/how-to-get-unique-list-using-a-key-word-python) – Georgy

risposta

12

È possibile creare un dict la cui chiave è la cosa dell'oggetto ei valori sono gli oggetti stessi.

d = {} 
for obj in object_list: 
    d[obj.thing] = obj 
desired_list = d.values() 
+7

Più breve: 'dict ((obj.thing, obj) per obj in Object_List) .values ​​() '. –

+0

Sicuramente mi piace, ma ho sempre difficoltà a leggere la comprensione del dettato, e volevo chiarire cosa stavo facendo. – Brien

+2

Python 3 lo rende più carino: '{obj.thing: obj for obj in object_list}' (ma restituisce una vista, non una lista, da 'values'). –

14

è possibile utilizzare un list comprehension e set:

objects = (object1,object2,object3,object4) 
seen = set() 
unique = [obj for obj in objects if obj.thing not in seen and not seen.add(obj.thing)] 

Il codice di cui sopra è equivalente a:

seen = set() 
unique = [] 
for obj in objects: 
    if obj.thing not in seen: 
     unique.append(obj) 
     seen.add(obj.thing) 
+0

Aumento di volume perché i set trasmettono l'attività meglio di quanto non facciano i Dit. Entrambi usano la nozione di oggetto "hashable" di Python e quindi sono funzionalmente equivalenti. Ma se sto leggendo il tuo codice, set mi dice "vuole un elenco univoco di cose" subito mentre dict mi dice "ha bisogno di mappare i dati", che in questo caso è fuorviante. – Dave

+5

Questa è una soluzione migliore, ma il codice genera un errore di sintassi in entrambi Python 2 e 3. unique = [obj per obj negli oggetti se obj.thing non è visto e non visto.add (obj.thing)] è la sintassi corretta – GDR

Problemi correlati