根据从头到尾的唯一出现对元组列表进行排序

Sort list of tuples based on unique occurrence from beginning to end

假设我有一个元组列表,例如:

x = [(2, 18), (18, 5), (3, 2)]

如何根据元组中值的唯一出现对这个元组列表进行排序?

例如,由于数字 3 仅出现在元组 (3, 2) 中并且是元组的 first 值,因此它应该是列表中的第一个条目.此条目后跟 (2, 18),因为 (3, 2) 的第二个值 (2) 出现在 (2, 18) 的第一个值中。最后,列表中的最后一个条目应该是 (18, 5),因为它的第一个值与 (2, 18).

的最后一个值相匹配

预期结果:

[(3, 2), (2, 18), (18, 5)]

如果您需要更多信息,请告诉我。

使用递归函数一张一张地挑选多米诺骨牌:

def get_elements_filtered_by_first_values(original_list, first_value):
   return [each_element for each_element in original_list if each_element[0] == first_value]

def add_next_domino(list_of_remained_dominos, list_of_picked_dominos):
   possible_domino_list_to_pick = get_elements_filtered_by_first_values(list_of_remained_dominos, list_of_picked_dominos[-1][1])
   if not len(possible_domino_list_to_pick):
      return None
   for each_possible_domino_to_pick in possible_domino_list_to_pick:
      new_list_of_picked_dominos = list_of_picked_dominos + [each_possible_domino_to_pick]
      new_list_of_remained_dominos = list_of_remained_dominos[:]
      new_list_of_remained_dominos.remove(each_possible_domino_to_pick)
      if not len(new_list_of_remained_dominos):
         return new_list_of_picked_dominos
      pick_domino_result = add_next_domino(new_list_of_remained_dominos, new_list_of_picked_dominos)
      if pick_domino_result is not None:
         return pick_domino_result
   return None

x = [(2, 18), (18, 5), (3, 2)]
eligible_elements = [each_element for each_element in x if each_element[0] not in map(lambda x: x[1], x)]
while len(eligible_elements):
   next_eligible_element = eligible_elements.pop()
   return_list = add_next_domino([each_element for each_element in x if each_element != next_eligible_element] ,[next_eligible_element])
   if return_list is not None:
      print(return_list)
      break

输出:

[(3, 2), (2, 18), (18, 5)]