如何根据定义的映射
按属性对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
]
然后得到像这样的结果
答案 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兼容,并且更容易理解。