2013-06-27 21 views
11

Mam listę obiektów, z których każdy ma określony atrybut. Ten atrybut nie jest unikalny i chciałbym skończyć z listą obiektów, która jest podzbiorem całej listy tak, że wszystkie określone atrybuty są unikalnym zestawem.Lista obiektów o unikalnym atrybucie

Na przykład, jeśli mam cztery obiekty:

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

chciałbym skończyć się albo

[object1, object2, object3] 

lub

[object1, object3, object4] 

Dokładne obiekty, które wiatr w Ostateczna lista nie jest ważna, a jedynie lista ich konkretnych atrybutów jest unikalna.

EDYCJA: Aby wyjaśnić, w zasadzie to, czego chcę, to zestaw, który jest wyłączony z tego konkretnego atrybutu.

+1

Możliwy duplikat [Jak zdobyć unikalne listy za pomocą słowa kluczowego: Python ] (https://stackoverflow.com/questions/10024646/how-to-get-unique-list-using-a-key-word-python) – Georgy

Odpowiedz

12

Można utworzyć dykt, którego kluczem jest obiekt, a wartościami są same obiekty.

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

Krótszy: 'dict ((obj.thing, obj) dla obj w object_list) .values ​​() '. –

+0

Zdecydowanie to lubię, ale zawsze ciężko jest mi czytać słowa dyktowane i chciałem wyjaśnić, co robię. – Brien

+2

Python 3 sprawia, że ​​jest ładniejsza: '{obj.thing: obj dla obj w liście_obiektów}' (ale zwraca widok, a nie listę, z 'wartości'). –

14

Można użyć list comprehension i 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)] 

Powyższy kod jest równoważny:

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

Wycofano, ponieważ zestawy przekazują zadanie lepiej niż dyktuje. Oba używają pojęcia Pythona o "mieniącym się" obiekcie, a więc są funkcjonalnie równoważne. Ale jeśli czytam twój kod, zestawy mówią mi "chce unikalnej listy rzeczy" od razu, podczas gdy dict mówi mi "potrzebuje mapowania danych", co w tym przypadku jest mylące. – Dave

+5

To jest ładniejsze rozwiązanie, ale kod powoduje błąd składni zarówno w Pythonie 2, jak i 3. unique = [obj dla obiektów w obj.thing, które nie są widoczne i niewidoczne.add (obj.thing)] to poprawna składnia – GDR

Powiązane problemy