我正在寻找一种在列表列表边界内优雅地生成所有可能的“掉期”的方法。我需要检查具有多条路线的某个列表,将两个城市交换会对该路线列表的总长度有何影响。所有城市都用整数表示。考虑以下示例:
route_list = [[0, 7, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0]]
每天,路线从0(代表HQ位置的整数)开始,并在此结束。我需要的是列出所有可能的交换。我已经指出必须使用**进行交换,所以预期的输出将是:
all_possible_swaps =
[[0, **40**, **7**, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0]],
[[0, **41**, 40 ,**7**, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0]],
[[0, **96**, 40 ,41, **7**, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0]],
直到
[[0, **57**, 40 ,41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, **7**, 0]],
然后,对于路由中的第一个元素(在本例中为7),所有可能的“掉期”已用尽。然后,代码应移至下一个元素40(在这种情况下为40),并与元素40进行所有可能的交换。
在过去的几天里,我一直在努力,我只能提出一种具有四重for循环的解决方案。我感觉这可以更加优雅地完成,因为交换数组元素是任何编程语言的基本组成部分。有人知道这个问题的 pythonic 解决方案吗?
答案 0 :(得分:1)
itertools.permutations是一个很好的函数,可以帮助您返回列表的所有可能选项。去除列表开头和结尾的0(起点)将产生以下假设routelist
这可能对您有帮助:
import itertools
routelist = [5, 8, 52, 16, 87]
matrix = list(itertools.permutations(routelist, 5))
print(matrix)
输出:
[(5, 8, 52, 16, 87), (5, 8, 52, 87, 16), (5, 8, 16, 52, 87), (5, 8, 16, 87, 52), (5, 8, 87, 52, 16), (5, 8, 87, 16, 52), (5, 52, 8, 16, 87), (5, 52, 8, 87, 16), (5, 52, 16, 8, 87), (5, 52, 16, 87, 8), (5, 52, 87, 8, 16), (5, 52, 87, 16, 8), (5, 16, 8, 52, 87), (5, 16, 8, 87, 52), (5, 16, 52, 8, 87), (5, 16, 52, 87, 8), (5, 16, 87, 8, 52), (5, 16, 87, 52, 8), (5, 87, 8, 52, 16), (5, 87, 8, 16, 52), (5, 87, 52, 8, 16), (5, 87, 52, 16, 8), (5, 87, 16, 8, 52), (5, 87, 16, 52, 8), (8, 5, 52, 16, 87), (8, 5, 52, 87, 16), (8, 5, 16, 52, 87), (8, 5, 16, 87, 52), (8, 5, 87, 52, 16), (8, 5, 87, 16, 52), (8, 52, 5, 16, 87), (8, 52, 5, 87, 16), (8, 52, 16, 5, 87), (8, 52, 16, 87, 5), (8, 52, 87, 5, 16), (8, 52, 87, 16, 5), (8, 16, 5, 52, 87), (8, 16, 5, 87, 52), (8, 16, 52, 5, 87), (8, 16, 52, 87, 5), (8, 16, 87, 5, 52), (8, 16, 87, 52, 5), (8, 87, 5, 52, 16), (8, 87, 5, 16, 52), (8, 87, 52, 5, 16), (8, 87, 52, 16, 5), (8, 87, 16, 5, 52), (8, 87, 16, 52, 5), (52, 5, 8, 16, 87), (52, 5, 8, 87, 16), (52, 5, 16, 8, 87), (52, 5, 16, 87, 8), (52, 5, 87, 8, 16), (52, 5, 87, 16, 8), (52, 8, 5, 16, 87), (52, 8, 5, 87, 16), (52, 8, 16, 5, 87), (52, 8, 16, 87, 5), (52, 8, 87, 5, 16), (52, 8, 87, 16, 5), (52, 16, 5, 8, 87), (52, 16, 5, 87, 8), (52, 16, 8, 5, 87), (52, 16, 8, 87, 5), (52, 16, 87, 5, 8), (52, 16, 87, 8, 5), (52, 87, 5, 8, 16), (52, 87, 5, 16, 8), (52, 87, 8, 5, 16), (52, 87, 8, 16, 5), (52, 87, 16, 5, 8), (52, 87, 16, 8, 5), (16, 5, 8, 52, 87), (16, 5, 8, 87, 52), (16, 5, 52, 8, 87), (16, 5, 52, 87, 8), (16, 5, 87, 8, 52), (16, 5, 87, 52, 8), (16, 8, 5, 52, 87), (16, 8, 5, 87, 52), (16, 8, 52, 5, 87), (16, 8, 52, 87, 5), (16, 8, 87, 5, 52), (16, 8, 87, 52, 5), (16, 52, 5, 8, 87), (16, 52, 5, 87, 8), (16, 52, 8, 5, 87), (16, 52, 8, 87, 5), (16, 52, 87, 5, 8), (16, 52, 87, 8, 5), (16, 87, 5, 8, 52), (16, 87, 5, 52, 8), (16, 87, 8, 5, 52), (16, 87, 8, 52, 5), (16, 87, 52, 5, 8), (16, 87, 52, 8, 5), (87, 5, 8, 52, 16), (87, 5, 8, 16, 52), (87, 5, 52, 8, 16), (87, 5, 52, 16, 8), (87, 5, 16, 8, 52), (87, 5, 16, 52, 8), (87, 8, 5, 52, 16), (87, 8, 5, 16, 52), (87, 8, 52, 5, 16), (87, 8, 52, 16, 5), (87, 8, 16, 5, 52), (87, 8, 16, 52, 5), (87, 52, 5, 8, 16), (87, 52, 5, 16, 8), (87, 52, 8, 5, 16), (87, 52, 8, 16, 5), (87, 52, 16, 5, 8), (87, 52, 16, 8, 5), (87, 16, 5, 8, 52), (87, 16, 5, 52, 8), (87, 16, 8, 5, 52), (87, 16, 8, 52, 5), (87, 16, 52, 5, 8), (87, 16, 52, 8, 5)]