我有以下类型的列表:
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具有None在mate属性.是否有意义?
我想对这个列表进行排序,以便第一个人与最后一个匹配,第二个人与倒数第二个人匹配等等......属性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)
你可以尝试这样的事情:
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)
这是假设"作为配偶"是一对一的关系.