首页 > 解决方案 > 寻找一种pythonic方法来查找嵌套列表中的所有交换可能性

问题描述

我正在寻找一种方法来优雅地在列表的边界内生成所有可能的“交换”。我需要检查具有多条路线的某个列表,两个城市的交换对该路线列表的总长度会产生什么影响。所有城市都用整数表示。考虑这个例子:

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(代表总部位置的整数)开始,也从 0 结束。我需要的是列出所有可能的交换。我已经指出必须使用 ** ** 完成的交换,因此预期的输出将是:

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 进行所有可能的交换。

在过去的几天里,我一直在为此烦恼,我只能想出一个具有四重 for 循环的解决方案。我觉得这可以做得更优雅,因为交换数组元素是任何编程语言的基本部分。有谁知道这个问题的pythonic解决方案?

标签: pythonswapnested-lists

解决方案


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)]

推荐阅读