2013-06-27 3 views
11

각 속성에는 특정 속성이있는 객체 목록이 있습니다. 그 속성은 고유하지 않으며 모든 특정 속성이 모두 고유 한 집합이되도록 전체 목록의 하위 집합 인 객체의 목록을 작성하려고합니다. 예를 들어고유 한 속성을 가진 객체 목록

, 나는 네 개의 객체가있는 경우 :

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

내가 끝낼 할 것을 하나

[object1, object2, object3] 

또는

[object1, object3, object4] 

에 바람 정확한 객체 최종 목록은 중요하지 않으며 특정 속성의 목록 만 고유합니다.

EDIT : 명확하게 말하면, 필자가 원하는 것은 그 특정 속성에서 키 설정되는 세트입니다.

+1

의 사용 가능한 복제 [핵심 단어를 사용하여 고유의 목록을 얻을 방법 : 파이썬 ] (https://stackoverflow.com/questions/10024646/how-to-get-unique-list-using-a-key-word-python) – Georgy

답변

12

키는 객체의 것이고 값은 객체 자체 일 수 있습니다.

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

짧은 :'dict ((obj.thing, obj) in obj in object_list). 값()'. –

+0

나는 그것을 확실히 좋아하지만, 나는 항상 독해력을 읽는 데 어려움을 겪고 있으며, 내가하고있는 것을 분명히하고 싶었다. – Brien

+2

Python 3은'{obj.thing : object_list의 obj를위한 obj}'(그러나'values'의리스트가 아닌 뷰를 리턴합니다)를 더 편하게 만듭니다. –

14

당신은 사용할 수있는 list comprehensionset :

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

위의 코드가 동일합니다 :

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

집합이 dicts보다 작업을 잘 전달하기 때문에 Upvoted. 둘 다 Python의 "해시 가능"객체 개념을 사용하므로 기능적으로 동일합니다. 그러나 코드를 읽는다면, 세트는 즉시 "유일한 목록을 원합니다"라고 말하면서 dict이 "데이터를 매핑해야합니다."라고 말하지만,이 경우에는 오해의 소지가 있습니다. – Dave

+5

이것은 더 좋은 해결책이지만 코드는 파이썬 2와 3 모두에서 구문 오류를 발생시킵니다. unique = [obj.thing이 보이지 않고 보이지 않는 경우 객체의 obj에 대해 obj가 발생했습니다. [obj.thing]] 은 올바른 구문입니다. – GDR

관련 문제