如何在Python中基于多个属性(并计算它们)对对象列表进行排序?

时间:2016-10-25 09:25:16

标签: python sorting count

这是我班级的样子:

class Item:
    def __init__(self, name, is_old, is_init):
        self.name = name
        self.is_old = is_old
        self.is_init = is_init

我有一个这些对象的列表,我想对它们进行排序:如果is_init参数为true,则它们必须位于列表的前面,如果is_old参数为true,则它们必须在最后的清单。其他人应该在中间。我还想为每个对象生成一些计数(有多少个is_old参数为true,有多少有is_init参数为true等)。

我一直在用这个:

is_init_count = sum(p.is_init == True for p in item_list)
is_old_count = sum(p.is_old == True for p in item_list)
other_count = len(item_list) - is_init_count + is_old_count

但我认为可能有更多的pythonic方式,这可以与排序一起完成。

1 个答案:

答案 0 :(得分:0)

您可以使用返回您感兴趣的属性元组的键进行排序:

item_list = sorted(item_list, key=lambda x: (not x.is_init, x.is_new))

请注意,is_old参数在您的班级中保存为self.is_new,这可能会导致一些混淆。

接下来,您可以循环浏览此列表并计算您感兴趣的所有属性:

init = 0
old = 0
for i in item_list:
    if i.is_init:
        init += 1
    if i.is_new:
        old += 1
相关问题