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

时间:2009-10-10 20:45:19

标签: python sorting

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

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

sort_me =[object, d]

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

4 个答案:

答案 0 :(得分: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)

可以在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

您可以这样使用:

print sorted(list_of_stuff, key=extract_elem_v2('name'))

答案 1 :(得分:2)

sort_me.sort(key=attr_or_itemgetter('name'))

attr_or_itemgetter()

class attr_or_itemgetter(object):
    def __init__(self, name):
        self.name = name
    def __call__(self, obj):
        try: return getattr(obj, name)
        except AttributeError:
            return obj[name]

注意:它故意不检查字典类型,因此应用于字典的attr_or_itemgetter('items')将返回dict.items方法。

答案 2 :(得分:1)

这对我有用。请注意,sort()不会返回已排序的列表,但sorted()会返回,因此如果您要将其传递给模板,则应在参数中使用sorted,或sort在将列表作为参数传递之前。

itemized_action_list = list(chain(detection_point.insertbodyaction_set.all(),
                                  detection_point.insertheaderaction_set.all(),
                                  detection_point.modifybodyaction_set.all(),
                                  detection_point.modifyheaderaction_set.all(),
                                  detection_point.removebodyaction_set.all(),
                                  detection_point.removeheaderaction_set.all(),
                                  detection_point.redirectaction_set.all()))

sorted(itemized_action_list, key=attrgetter('priority'))

答案 3 :(得分:0)

new_list = [10,“ m”,20,30,“ a”,“ r”,70,“ d”]

def func(x):

if type(x) == str:

    return ord(x)+100

return x

new_list.sort(key = func)

打印(新列表)

[10,20,30,70,'a','d','m','r']