Как вставить элементы из одного списка в другой, генерируя все возможные комбинации - PullRequest
1 голос
/ 19 октября 2019

Привет, ребята, мне нужна помощь со списками в Python. Предположим, у меня есть два списка.

a = [3,1,5]
b = [2,4]

Я хочу вставлять элементы списка b последовательно (без изменения порядка a), генерируя новые списки. Например.

ans = [[2,4,3,1,5],[2,3,4,1,5],[2,3,1,4,5],[2,3,1,5,4],[3,2,4,1,5]...]

Спасибо за вашу помощь Я надеюсь, что смог правильно выразить себя.

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Я даю вам еще один вариант.

        import itertools 

        a = [3,1,5]
        b = [2,4]

        c = [b +[a]][0] #0 to get only one level of nested

        #print(c)
        #[2, 4, [3, 1, 5]]

        perm = [x for x in itertools.permutations(c, 3)] 

        ans = []

Вот формула для получения вашего "ans" вывода:

       for i in range(len(perm)): 

          groups = perm[i] #this is the subset like [2, 4, [3, 1, 5]]

          #flatten the list or returns integer
          clean = [y for x in groups for y in (x if isinstance(x,list) else [x])]
          ans.append(clean)

          print(clean)
          [[2, 4, 3, 1, 5], [2, 3, 1, 5, 4], [4, 2, 3, 1, 5], [4, 3, 1, 5, 2], [3, 1, 5, 2, 4], [3, 1, 5, 4, 2]]
0 голосов
/ 19 октября 2019

Не самый чистый способ сделать это, но вот что я имею в виду:

from itertools import permutations

a = [3,1,5]
b = [2,4]

def a_order_is_same(perm):
    i3, i1, i5 = perm.index(3), perm.index(1), perm.index(5)
    return i3 < i1 < i5

ans = [p for p in permutations(a+b) if a_order_is_same(p)]

for p in ans:
    print(p)

--------------------------------------------------

(3, 1, 5, 2, 4)
(3, 1, 5, 4, 2)
(3, 1, 2, 5, 4)
(3, 1, 2, 4, 5)
(3, 1, 4, 5, 2)
(3, 1, 4, 2, 5)
(3, 2, 1, 5, 4)
(3, 2, 1, 4, 5)
(3, 2, 4, 1, 5)
(3, 4, 1, 5, 2)
(3, 4, 1, 2, 5)
(3, 4, 2, 1, 5)
(2, 3, 1, 5, 4)
(2, 3, 1, 4, 5)
(2, 3, 4, 1, 5)
(2, 4, 3, 1, 5)
(4, 3, 1, 5, 2)
(4, 3, 1, 2, 5)
(4, 3, 2, 1, 5)
(4, 2, 3, 1, 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...