В поисках pythoni c способа найти все возможности свопинга во вложенном списке - PullRequest
0 голосов
/ 07 апреля 2020

Я ищу способ элегантно сгенерировать все возможные "перестановки" в границах списка списков. Мне нужно проверить определенный список с несколькими маршрутами, что поменяет местами два города на общую длину этого списка маршрутов. Все города представлены целыми числами. Рассмотрим следующий пример:

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.

Я ломал голову над этим последние пару дней, и я могу только придумать решение, у которого есть четверка для -l oop. У меня такое чувство, что это можно сделать гораздо более элегантно, так как замена элементов массива является основной частью любого языка программирования. Кто-нибудь знает решение pythoni c для этой проблемы?

1 Ответ

1 голос
/ 07 апреля 2020

itertools.permutations - это хорошая функция, которая помогает вам возвращать все возможные параметры списка. удаление 0 (начальных точек) начала и конца списка приводит к следующей гипотетической routelist Это может помочь вам:

import itertools

routelist = [5, 8, 52, 16, 87]

matrix = list(itertools.permutations(routelist, 5))

print(matrix) 

output:

[(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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...