Quello che quasi sicuramente stai cercando è utilizzare l'opzione key = per sorted(), che fornisce una funzione che restituisce una chiave di ordinamento arbitraria per ogni elemento. Questa funzione può controllare il tipo di argomento e intraprendere varie azioni. Per esempio:
import types
class obj(object):
def __init__(self, arg):
self.name = arg
def extract_name(obj):
if type(obj) is types.DictType:
return obj['name']
else:
return obj.__dict__['name']
d = { 'name': 'Jill'}
print sorted([obj('Jack'), d], key=extract_name)
Maggiori informazioni possono essere trovate sul suggerimento Python wiki
di RichieHindle di utilizzare isinstance è un buon compromesso. E mentre ero a che ho pensato che potrebbe essere bello per sostenere i nomi degli elementi arbitrari anziché hardcoding 'name':
def extract_elem_v2(elem_name):
def key_extractor(obj):
dct = obj if isinstance(obj, dict) else obj.__dict__
return dct[elem_name]
return key_extractor
che è possibile utilizzare in questo modo:
print sorted(list_of_stuff, key=extract_elem_v2('name'))
fonte
2009-10-10 20:51:57
+1. Suggerimento minore: 'isinstance (obj, dict)' sarebbe più ordinato e consentirebbe alle classi derivate da 'dict'. – RichieHindle
Hai ragione, isinstance è una scelta migliore lì, non sono sicuro del perché non ci ho pensato. Versione aggiornata aggiunta alla risposta. Grazie! –
Grazie mille Jack! Questa risposta è bella. – hekevintran