2014-09-25 2 views
5

Ho una classe:Come ottenere valori unici da un elenco di oggetti pitone

class Car: 
    make 
    model 
    year 

Ho una lista di auto e voglio ottenere un elenco di modelli unici tra i miei Cars.

L'elenco è potenzialmente decine di migliaia di elementi. Qual'è il miglior modo per farlo?

Grazie.

+0

vuoi dire modelli che sono solo nella lista una o di accorciare la lista per avere solo uno di ciascuno? –

+0

costruire un set, suppongo? – HuStmpHrrr

+0

Inoltre: http://stackoverflow.com/questions/6926928/get-unique-items-from-list-of-lists http://stackoverflow.com/questions/479897/how-do-you-remove-duplicates- da-a-list-in-python-if-the-item-order-is-not-impo – tom10

risposta

16

Utilizzare uno set comprehension. Gli insiemi sono raccolte non ordinate di elementi unici, il che significa che eventuali duplicati verranno rimossi.

cars = [...] # A list of Car objects. 

models = {car.model for car in cars} 

Ciò iterare l'elenco cars e aggiungere il valore di ogni car.model al massimo una volta, il che significa che sarà una collezione unica.

+0

Molte persone trovano i colli da leggere - sembrano dizionari. In quel contesto, come alternativa 'models = list (set ([car.model per auto in auto]))' – theodox

+2

paghi un bel po 'di prezzo per sbarazzarti dei curlies, vero? – flaschbier

+0

Sì, penso che sia perché prima si crea l'elenco completo (con i duplicati), quindi lo si aggiunge a un set (il che significa che si rimuovono i duplicati), quindi lo si rimette in un elenco. – Ffisegydd

1

Se si vuole trovare auto che compaiono solo una volta:

from collections import Counter 
car_list = ["ford","toyota","toyota","honda"] 
c = Counter(car_list) 
cars = [model for model in c if c[model] == 1 ] 
print cars 
['honda', 'ford'] 
+0

Sì, l'ho letto in modo diverso (come l'OP che desiderava il set unico di modelli che aveva). Spero che risponderanno e lo chiariranno :) – Ffisegydd

+0

+1: o questa è la risposta che l'OP sta cercando, o questo è solo un duplicato di altre 50 domande. – tom10