Python:根据两个属性对列表进行排序

Rem*_*i.b 4 python sorting

我有以下类型的列表:

class Ind(object):
    def __init__(self,ID,mate):
        self.ID=ID
        self.mate=mate

population=[Ind(8,None), Ind(1,2), Ind(20,3), Ind(2,1), Ind(12,None), Ind(3,20), Ind(10,11), Ind(11,10)]
Run Code Online (Sandbox Code Playgroud)

您可以将此列表population视为所有人都拥有的个人群体ID.他们中的一些人mate(一个人出现在同一人群或相同的名单中).mate价值实际上ID是配偶的价值!因此,如果存在的一个实例Ind哪些属性ID等于12和mate等于34,那么就必须在其列表中的个体ID等于34,其mate等于12个人没有一个mate具有Nonemate属性.是否有意义?

我想对这个列表进行排序,以便第一个人与最后一个匹配,第二个人与倒数第二个人匹配等等......属性mate等于的个体None应该位于列表的中间.

有许多可能的输出符合我的要求.以下是上述列表中这些输出的一个示例:

population=[Ind(1,2), Ind(20,3), Ind(10,11), Ind(8,None), Ind(12,None), Ind(11,10), Ind(3,20), Ind(2,1)]
Run Code Online (Sandbox Code Playgroud)

fre*_*ish 5

你可以尝试这样的事情:

def custom_sort(population):
    pop_dict = { ind.ID: ind for ind in population }

    start = []
    nones = []
    end = []
    for ind in population:
        if ind.mate is None:
            nones.append(ind)
        elif pop_dict[ind.mate] not in start:
            start.insert(0, ind)
            end.append(pop_dict[ind.mate])
    return start + nones + end
Run Code Online (Sandbox Code Playgroud)

这是假设"作为配偶"是一对一的关系.