Например:

s = ["ab", "cd"]

# expected output ac, ad, bc, bd
# This is easy

print([i+j for i in s[0] for j in s[1]])
# ['ac', 'ad', 'bc', 'bd']

Но когда длина списка больше двух, как этого добиться с помощью понимания списка?

s = ["ab", "cd", "ef"]

Должен дать ace, acf, ade, adf, bce, bcf, bde, bdf. (Как использовать цикл for для достижения этого, если мы не используем рекурсию?)

0
Kevin Mayo 14 Ноя 2020 в 10:51

1 ответ

Лучший ответ

Вы ищете продукт этих последовательностей. itertools.product делает именно это. Единственная сложность - это преобразование последовательностей обратно в строки, что вы можете сделать с помощью join():

from itertools import product

s = ["ab", "cd", "ef"]

list(map(''.join, product(*s)))
# ['ace', 'acf', 'ade', 'adf', 'bce', 'bcf', 'bde', 'bdf']

Вы также можете использовать понимание списка, если хотите:

[''.join(t) for t in product(*s)]

Вы, конечно, можете сделать это самостоятельно с помощью простой рекурсивной функции. Это может выглядеть примерно так:

s = ["ab", "cd", "ef"]

def product(l):
    if len(l) == 0:
        yield ''
        return
    
    start, *rest = l
    for c in start:
        for sublist in product(rest):
            yield c + sublist

list(product(s))
# ['ace', 'acf', 'ade', 'adf', 'bce', 'bcf', 'bde', 'bdf']
3
Mark M 14 Ноя 2020 в 08:04