python - 寻找一种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解决方案?
解决方案
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)]
推荐阅读
- ruby-on-rails - 检查在 Rails Capybara 中可见不到一秒的元素可见性
- javascript - 为什么我无法使用 AJAX 更新我的 sql 数据库?
- javascript - 如何在 React-js 中为捕获阶段注册事件处理程序?
- javascript - 为什么 str[i] 在哪一边很重要?添加到 newRev 时
- javascript - GWT 可以与其他库共存吗?
- mockito - Micronaut 和 PowerMock
- algorithm - 嵌套递归调用 - 这是尾递归吗?
- javascript - 为什么 javascript 不注册这个 onmouseup 事件?
- python - 如何减少包含 numpy、scipy 和 scikit-learn 的最终 docker 映像大小
- ios - 在移动设备管理下向 iPhone 发送命令