根据主列表排序类实例列表

时间:2013-07-12 12:28:33

标签: python list class sorting

我有一个类实例列表,如下所示:

classes = [A(someval), B(someval), C(someval)]

我想使用“主”列表对此列表进行排序。

master_list = [B, A]

如果列表中存在BA,则会先排序,如果它们存在且始终按照master_list中指定的顺序排序。这些类是字段验证器,所以我希望每个类都不会超过一个,但是人们永远无法确定。

任何其他类实例都可以以它们出现的任何顺序出现。

我希望能够根据另一个主列表在列表末尾放置一些实例,但我怀疑这里做的最好只是反转列表并再次执行相同的操作。

但我该怎么做?

编辑:子类并不重要,因为这些验证器类只有一个可调用的方法,通常都是非常简单的野兽。我还没有遇到一个子类验证器,我试图想象一个有益的场景,但我不能。

2 个答案:

答案 0 :(得分:5)

您可以使用列表类的index功能。这是一个简单的例子:

class A: pass
class B: pass
class C: pass

classes = [A(), B(), C()]
master_list = [B, A]

def sorter(instance):
    # get the type of the object
    c = instance.__class__
    # if it is in the master_list, use its index, otherwise put it at the end
    return master_list.index(c) if c in master_list else len(master_list)

final_list = sorted(classes, key=sorter)

final_list现在是

[<__main__.B instance at 0x023348C8>, <__main__.A instance at 0x01EE64B8>, <__main__.C instance at 0x023348F0>]

答案 1 :(得分:3)

def class_order(master_list):
    master_dict = { cls:i for (i, cls) in enumerate(master_list) }
    return lambda i: master_dict.get(i.__class__, len(master_list))

# I renamed ‘classes’ to ‘instances’ because it makes more sense.
sorted(instances, key=class_order(master_list))

这假设只有master_list中的类的直接实例出现在原始列表中。如果出现从A或B派生的东西,它们将不会被分类为As或Bs,它们应该是。