我有一个类实例列表,如下所示:
classes = [A(someval), B(someval), C(someval)]
我想使用“主”列表对此列表进行排序。
master_list = [B, A]
如果列表中存在B
和A
,则会先排序,如果它们存在且始终按照master_list
中指定的顺序排序。这些类是字段验证器,所以我希望每个类都不会超过一个,但是人们永远无法确定。
任何其他类实例都可以以它们出现的任何顺序出现。
我希望能够根据另一个主列表在列表末尾放置一些实例,但我怀疑这里做的最好只是反转列表并再次执行相同的操作。
但我该怎么做?
编辑:子类并不重要,因为这些验证器类只有一个可调用的方法,通常都是非常简单的野兽。我还没有遇到一个子类验证器,我试图想象一个有益的场景,但我不能。
答案 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,它们应该是。