Как объединить списки, выбрав по одному элементу для каждого индекса? - PullRequest
0 голосов
/ 06 мая 2020

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

input: ['a', 'b'], ['c', 'd']

вывод: ['ab', 'ad', 'cb', 'cd']

Я сделал функцию, которая делает это полууспешно здесь:

def mix_list(lst1, lst2):
    res = []
    k = max(len(lst1), len(lst2))
    ref = itertools.product(range(2), repeat=k)

    for comb in list(ref):
        temp = [None] * k
        for i, e in enumerate(comb):
            if e == 0:
                try:
                    temp[i] = lst1[i]
                except IndexError:
                    temp[i] = lst2[i]
            elif e == 1:
                try:
                    temp[i] = lst2[i]
                except IndexError:
                    temp[i] = lst1[i]
        res.append(temp)
    return [''.join(i) for i in set(map(tuple, res))]

Моей первой мыслью было, что у itertools будет какая-то функция, которая sh это выполнит, но я ничего не нашел. Кроме того, я немного погуглил и искал здесь, но мне не удалось найти что-то, что делает то, что я ищу, немного быстрее или проще.

Есть ли лучший способ сделать это sh или, может быть, библиотека, в которой есть функция, которая уже делает это?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы можете zip() два списка вместе, чтобы получить список пар значений по соответствующим индексам, а затем использовать product(), чтобы получить все комбинации выбора одного элемента по каждому индексу:

>>> lst1, lst2 = ['a','b'], ['c','d']
>>> list(product(*zip(lst1, lst2)))
[('a', 'b'), ('a', 'd'), ('c', 'b'), ('c', 'd')]

Это можно легко расширить до произвольного числа и длины списков, но размер результата будет расти экспоненциально.

0 голосов
/ 06 мая 2020

Вы должны преобразовать

['a','b'], ['c','d']

в

['a','c'], ['b','d']

(первый список имеет значения для индекса 1, второй список имеет значения для индекса 2)

и затем используйте itertools.product()

import itertools 

a, b = zip(['a','b'], ['c','d'])
#print(a, b)  # ['a','c'], ['b','d']

data = itertools.product(a, b)

data = ["".join(item) for item in data]

print(data)

Результат

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