python按属性基于预定义映射排序对象列表

时间:2014-06-05 09:28:18

标签: python

如何根据定义的映射

按属性对python对象列表进行排序

E.g。

import random


class Obj(object):
    attr = None

    def __init__(self, attr):
        self.attr = attr

    def __repr__(self):
        return self.attr

attrs = ['GROUPA', 'GROUPB', 'GROUPC']

objects = []

for x in range(0, 10):
    objects.append(Obj(random.choice(attrs)))

objects = sorted(objects, key=lambda o: o.attr)

print '['
for o in objects:
    print o
print ']'

给我

[
    GROUPA
    GROUPA
    GROUPA
    GROUPA
    GROUPB
    GROUPB
    GROUPB
    GROUPB
    GROUPC
    GROUPC
]

哪个好,但我想定义一个映射并在排序时考虑它,例如:

mapping = ['GROUPB', 'GROUPA', 'GROUPC']

结果:

[
    GROUPB
    GROUPB
    GROUPB
    GROUPB
    GROUPA
    GROUPA
    GROUPA
    GROUPA
    GROUPC
    GROUPC
]

然后得到像这样的结果

2 个答案:

答案 0 :(得分:2)

您可以在字典中定义映射,其中键作为要映射的字符,它们的值为整数,较低值的字符具有较小的整数,如下所示:

mapping = {'B': 1, 'A': 2, 'C': 3}

然后你可以在lambda方法中使用这个字典:

sorted(objects, key=lambda o: mapping[o.attr])

答案 1 :(得分:-1)

您可以使用cmp内置的sorted参数。定义一个比较函数,在其中检查元素是否为' mapping列表中的相应位置。类似的东西:

def compare(a, b):
    return cmp(mapping.index(a), mapping.index(b))

然后,你使用它:

objects = sorted(objects, cmp=compare)

更好的是,正如评论中的一些建议,您可以绕过cmp参数并直接使用key

objects = sorted(objects, key=lambda o: mapping.index(o.attr))

这样,您的代码将与Python 3兼容,并且更容易理解。