2015-07-31 15 views
5

a ordinare alcuni oggetti basati su uno dei loro attributi, utilizzando qualcosa di simile a questo:Confronto delle liste di oggetti con chiave personalizzata

sorted_list = sorted(unsorted_list, key=lambda x: x.my_attr) 

Esiste un modo per ordinare un elenco di liste di questi oggetti, nello stesso in che modo Python può ordinare elenchi di liste di interi? Posso sovraccaricare __cmp__(self, other) per questi oggetti, ma questo genera difficoltà in un pacchetto esterno. Anche il nidificazione può diventare arbitrariamente profondo, quindi non penso di poter usare solo una comprensione delle liste.

Mi chiedevo se c'era qualcosa in cui potevo generare elenchi di my_attr e collegarlo agli elenchi corrispondenti di oggetti. Non riesco a pensare a un bel modo per farlo a mano libera.

+0

è possibile mostrare esempio delle vostre liste annidate forse c'è un modo migliore per farlo senza generare liste di 'my_attr'. ? Includere anche previsto in uscita – styvane

+0

'[[340 NN, 338 CC], [344 C CB, 350 C CG1], [357 CC, 358 OO], [343 H HA]]' Questo è un esempio del primo livello di ricorsione. Gli oggetti sono atomi, e quello che sto cercando di fare è sorta basano sulle regole di Cahn [Ingold Prelog] (https://en.wikipedia.org/wiki/Cahn%E2%80%93Ingold%E2%80%93Prelog_priority_rules #Assignment_of_priorities). È l'espansione del passo numero 2 che sta causando il nesting e l'attributo che sto usando è il numero atomico dell'atomo. –

+3

Dovresti [modificare] (http://stackoverflow.com/posts/31751232/edit) la tua domanda e aggiungerla. – styvane

risposta

0

È possibile implementare funzioni di confronto sul tipo di dati e quindi fare affidamento su funzioni di ordinamento di Python.

Vedi domanda simile e risponde: Python: Sort custom class without use of `key` argument?

In breve, è possibile utilizzare total_ordering meta-classe e implementare __eq__ e __lt__ funzioni.

Nel vostro caso specifico, è possibile implementare __eq__ come questo:

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

e allo stesso modo per __lt__.