Python lamda函数根据与先前元组的关系对元组列表进行排序

问题描述

是否可以使用sorted(list,lambda x:..)元组列表进行排序,以使下一个元组的第一个值等于上一个元组的第二个值?

list_of_tuples = [("JFK","DEN"),("LAX","ORD"),("DEN","SFO"),("LAS","LAX"),("ORD","ATL"),("ATL","JFK"),("SFO","LAS")]
Desired_output = [('JFK','DEN'),('DEN','SFO'),('SFO','LAS'),('LAS','LAX'),('LAX','ORD'),('ORD','ATL'),('ATL','JFK')]

我知道如何按元组sorted(list_of_tuples,key = lambda x: x[0]))中的任何一个值进行排序,但是使用lambda进行排序并以某种方式引用列表中的先前值的最佳方法是什么?

解决方法

sorted()无法实现。但是您可以使用for循环来解决它。

d = dict(list_of_tuples)
res = [list_of_tuples[0]]
prev = res[0]

for idx in range(len(list_of_tuples) - 1):
    prev = (prev[1],d[prev[1]])
    res.append(prev)
print(res)

输出:

[('JFK','DEN'),('DEN','SFO'),('SFO','LAS'),('LAS','LAX'),('LAX','ORD'),('ORD','ATL'),('ATL','JFK')]
,

您无法使用sorted()执行此操作。您正在寻找的是图形中的哈密尔顿路径

这里的图的顶点就是您的元组,并且如果一个元组的最后一个值与另一个元组的第一个值匹配,则从一个元组到另一个元组之间存在有向边。

但是,如果下一个元组始终只有一个可能的候选者,并且您知道可以从列表中的第一个元素开始,那么问题就简单得多,并且不需要任何复杂的哈密尔顿路径算法。

首先,将列表中的元素放入高效的数据结构中,从而可以轻松地搜索下一个元组。您可以使用python字典。然后,一一添加元素。

list_of_tuples = [("JFK","DEN"),("LAX","ORD"),("DEN","SFO"),("LAS","LAX"),("ORD","ATL"),("ATL","JFK"),("SFO","LAS")]

dict_first = {}
for pair in list_of_tuples:
  dict_first[pair[0]] = pair

result = [list_of_tuples[0]]
key = list_of_tuples[0][-1]
result = []
while key in dict_first and len(result) < len(list_of_tuples):
  result.append(dict_first[key])
  key = result[-1][-1]

print(result)

输出:

[('JFK','JFK')]

,

尝试此代码,

list_of_tuples = [("JFK","LAS")]
Desired_output=[list_of_tuples[0]]
for i in range (len(list_of_tuples)):
    for j in  list_of_tuples:
        if Desired_output[i][1]==j[0]:
            Desired_output.append(j)
print(Desired_output)