python. объединить два списка в одну ленту - PullRequest
0 голосов
/ 29 мая 2020

Проблема состоит в том, чтобы построить расширенные списки из двух списков одинаковой длины. например, есть

qq=['a','b','c']
ww=['d','e','f']

my_function(qq,ww)

#I want to see output like:
output = [['a','b','c'],['a','b','f'],['a','e','c'],['a','e','f'],['d','e','f'],['d','e','c'],['d','b','f'],['d','b','c']]

все комбинации создания списка одинаковой длины с ограничением:

  • если выбрано a, то d нельзя выбрать, то же logi c,
  • , если выбрано b, то нельзя выбрать e,
  • если выбрано c, то нельзя выбрать f.

Важным является положение элементов в списке.

поэтому функция принимает два списка строк одинаковой длины. и возвращает список комбинаций. Как мне это написать?

Ответы [ 2 ]

8 голосов
/ 29 мая 2020

Вы хотите из ваших 2-х списков произвести произведение пар [a,d] * [b,e] * [c,f]. Использование zip для создания пары и product для их объединения приводит к тому, что

  • принимает только один элемент из каждой пары, поэтому один элемент на индекс с zip
  • построить все комбинации между парами, с product
from itertools import product
def custom_product(valuesA, valuesB):
    return list(product(*zip(valuesA, valuesB))) # return list of tuple

def custom_product(valuesA, valuesB):
    return list(map(list, product(*zip(valuesA, valuesB)))) # return list of list

CODE DEMO

1 голос
/ 29 мая 2020

Вот рекурсивное решение.

В базовом случае, конечно, в каждом списке есть только один элемент, и мы принимаем каждый список как возможный результат. Для более длинных списков вы находите все возможные варианты расположения списков, не считая первых элементов, а затем возвращаете эти элементы с каждым из первых элементов.


def solve(list1, list2):
     if len(list1) != len(list2):
         throw ValueError("Lists should be same length")
     if len(list1) == 0:
         return []
     if len(list1) == 1:
         return [[list1[0], list2[0]]
     children = solve(list1[1:], list2[1:])
     return [[list1[0]] + child for child in children] + [[list2[0]] + child for child in children]]

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