2013-06-27 55 views
11

Tôi có một danh sách các đối tượng mà mỗi đối tượng đều có một thuộc tính cụ thể. Thuộc tính đó không phải là duy nhất, và tôi muốn kết thúc với một danh sách các đối tượng là một tập con của toàn bộ danh sách sao cho tất cả các thuộc tính cụ thể là một tập duy nhất.Danh sách các đối tượng có thuộc tính duy nhất

Ví dụ, nếu tôi có bốn đối tượng:

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

tôi muốn kết thúc với một trong hai

[object1, object2, object3] 

hoặc

[object1, object3, object4] 

Đối tượng chính xác mà gió lên trong danh sách cuối cùng không quan trọng, chỉ có một danh sách thuộc tính cụ thể của chúng là duy nhất.

EDIT: Để làm rõ, về cơ bản những gì tôi muốn là tập hợp được tắt khóa của thuộc tính cụ thể đó.

+1

có thể trùng lặp của [Làm thế nào để có được danh sách duy nhất sử dụng một từ khóa: Python ] (https://stackoverflow.com/questions/10024646/how-to-get-unique-list-using-a-key-word-python) – Georgy

Trả lời

12

Bạn có thể tạo một dict có khóa là vật và giá trị của đối tượng là chính các đối tượng đó.

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

Ngắn hơn: 'dict ((obj.thing, obj) cho obj in object_list) .values ​​() '. –

+0

Tôi chắc chắn như vậy nhưng tôi luôn luôn có một thời gian khó đọc đọc hiểu dict, và tôi muốn làm cho nó rõ ràng những gì tôi đã làm. – Brien

+2

Python 3 làm cho nó đẹp hơn: '{obj.thing: obj cho obj trong object_list}' (nhưng trả về một khung nhìn, không phải là một danh sách, từ 'giá trị'). –

14

Bạn có thể sử dụng một 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)] 

Đoạn mã trên tương đương với:

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

Được thăng hạng vì các bộ truyền đạt nhiệm vụ tốt hơn so với các dicts. Cả hai đều sử dụng khái niệm "đối tượng băm" của Python và do đó có chức năng tương đương. Nhưng nếu tôi đọc mã của bạn, bộ nói với tôi "anh ấy muốn một danh sách duy nhất của sự vật" ngay lập tức trong khi dict nói với tôi "anh ta cần phải dữ liệu bản đồ", mà trong trường hợp này là gây hiểu lầm. – Dave

+5

Đây là giải pháp đẹp hơn, nhưng mã dẫn đến lỗi cú pháp trong cả Python 2 và 3. unique = [obj cho obj trong các đối tượng nếu obj.thing không nhìn thấy và không nhìn thấy.add (obj.thing)] là cú pháp đúng – GDR

Các vấn đề liên quan