在Python中对异构的对象列表进行排序

hek*_*ran 5 python sorting

我有一些我想要排序的自定义对象和词典.我想将字典对象排序在一起.我想按属性和字典按键对对象进行排序.

object.name = 'Jack'
d = {'name':'Jill'}

sort_me =[object, d]
Run Code Online (Sandbox Code Playgroud)

如何使用对象的name属性和字典的'name'键对此列表进行排序?

Jac*_*oyd 8

你几乎肯定要找的是对sorted()使用key =选项,它提供了一个函数,它返回每个元素的任意排序键.此函数可以检查其参数的类型并执行各种操作.例如:

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)
Run Code Online (Sandbox Code Playgroud)

可以在Python wiki上找到更多信息

RichieHindle建议使用isinstance是一个很好的建议.当我在它的时候,我认为支持任意元素名称而不是硬编码'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
Run Code Online (Sandbox Code Playgroud)

您可以这样使用:

print sorted(list_of_stuff, key=extract_elem_v2('name'))
Run Code Online (Sandbox Code Playgroud)

  • +1.次要建议:`isinstance(obj,dict)`会更整洁,并允许从`dict'派生的类. (3认同)