Lo que seguramente está buscando es utilizar la opción key = para sorted(), que proporciona una función que devuelve una clave de clasificación arbitraria para cada elemento. Esta función puede verificar el tipo de su argumento y tomar varias acciones. Por ejemplo:
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)
Más información se puede encontrar en la sugerencia de utilizar la isinstance Python wiki
de RichieHindle es una buena. Y mientras yo estaba en que pensé que sería bueno para apoyar a los nombres de elementos arbitrarios en lugar de codificar 'nombre':
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
que se puede utilizar de esta manera:
print sorted(list_of_stuff, key=extract_elem_v2('name'))
+1. Sugerencia menor: 'isinstance (obj, dict)' sería más nítido, y permitiría las clases derivadas de 'dict'. – RichieHindle
Tienes razón, la instancia es una mejor opción allí, no estoy seguro de por qué no pensé en eso. Versión actualizada adjunta a la respuesta. ¡Gracias! –
¡Muchas gracias, Jack! Esta respuesta es hermosa. – hekevintran