2015-04-23 21 views
11

farklı nesneleri içeren iç içe geçmiş bir liste var Nesneleri ve ben bunları kaldırmak için çalışıyorum ama birPython onlar iç içe listedeki nesnelerin yinelenen çiftleri konum

TypeError: unorderable types: practice() < practice()

almaya devam sıralama nasıl

Bu hata beni nesneler yerine tamsayılar birlikte çalışarak ama burada çiftleri elemek başka nasıl bilmiyorum neden olur biliyorum tarafından nesneleri karşılaştırmak isterseniz ben

class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

a = practice('a') 
b = practice('b') 
c = practice('c') 
d = practice('d') 
e = practice('e') 
f = practice('f') 

x = [[a,b],[c,d],[a,b],[e,f],[a,b]] 

unique_list = list() 
for item in x: 
    if sorted(item) not in unique_list: 
     unique_list.append(sorted(item)) 

print(unique_list) 
+2

Geçiş çalışması gerekir: açıklamalarda belirtildiği gibi

, bunu yapmak için başka bir yol yerleşik sorted için açık anahtar işlevi sağlamaktır. – Luca

cevap

6

çalıştı budur id:

class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

    def __lt__(self, other): 
     return other.id > self.id 

    def __gt__(self, other): 
     return self.id > other.id 

unique_list = list() 
for item in x: 
    if sorted(item) not in unique_list: 
     unique_list.append(sorted(item)) 

print(unique_list) 
[[<__main__.practice object at 0x7fe87e717c88>, <__main__.practice object at 0x7fe87e717cc0>], 
[<__main__.practice object at 0x7fe86f5f79e8>, <__main__.practice object at 0x7fe86f589278>], 
[<__main__.practice object at 0x7fe86f589be0>, <__main__.practice object at 0x7fe86f589c18>]] 

tüm rich comparison ordering methods sen functools.total_ordering kullanabilirsiniz uygulamak istediğiniz işlevselliği bağlı olarak, sadece yöntemlerden birini tanımlamak gerekir ve bir Verilen dinlenme

from functools import total_ordering 
@total_ordering 
class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

    def __lt__(self, other): 
     return other.id > self.id 

    def __eq__(self, other): 
     return self.id == other.id 

ilgilenecek Bir veya daha fazla zengin karşılaştırma siparişi metodu tanımlayan sınıf, bu sınıf dekoratörü geri kalanı sağlar. sınıf __lt__() birini __le__(), __gt__() veya __ge__() tanımlamalıdır

: Bu olası zengin karşılaştırma işlemlerinin hepsi belirterek harcanan çabaları kolaylaştırır. Ayrıca, sınıf bir __eq__() yöntemini sağlamalıdır. Eğer iş başka operatörlere istiyorsanız

class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

    def __lt__(self, other): 
     return self.id < other.id 

, onların özel uygulamak gerekir:

+0

İlk seçenek benim için çalıştı ... Teşekkürler – danidee

+0

Hiçbir prob, daha sonra daha fazla işlevsellik eklemek istiyorsanız yardımcı olabilecek ikinci örneği ekledim. –

3

Python 3'te nesneler için açık anahtarlar olmadan sıralama desteklemek için , sen __lt__ özel yöntem uygulamalıdır Yöntemler, ama __lt__ sıralama için ihtiyacınız olan tek şey. sorted` `Bir karşılaştırıcı` key` içinde

sorted(item, key=lambda x: x.id) 
+0

lambda yöntemini kullanmaya çalışıyordu, yeni bir değişken oluşturdum ve eşitledim sıralamak için (öğe, anahtar = lambda x: x.id) ama değeri yazdırmaya çalıştığımda, uygulama nesnesinin yinelenen olmadığını anlıyorum. Bir liste olması gerekmiyor mu? – danidee

+0

@danidee Sıralanan ilk argüman, pratik nesnelerin yinelenebilir olması gerekir. Öyleyse, örneğin, sıralanmış ([practice ('b'), pratiği ('a')], anahtar = lambda x: x.id) 'yi deneyin. Bu formda yeni bir liste döndürecektir: '[practice ('a'), practice ('b')]' – Shashank

İlgili konular