来自 N 个列表的条目的组合

Combination of entries from N lists

我在 python 中有 N 个列表 [每个列表的大小可能不同]。 N 本身的值也可能不同。

让我们考虑一个示例,其中列表的数量为 3 [为简单起见,每个列表的大小为 2]:

[A, B], [C, D], [E, F]

现在我期待的是这样的:

ACE, ADE, ACF, ADF, BCE, BDE, BCF, BDF

所有列表中每个条目的组合[我们将避免组合来自同一列表的条目]。

解决这个问题最有效的方法是什么? [我不确定网上是否有类似的问题,因为我找不到]。

运行 此代码:

from itertools import product
from functools import reduce

def combine_words(list1, list2):
    word_pairs = product(list1, list2)
    combined_words = []
    for pair in word_pairs:
        combined_words.append("".join(pair))
    return combined_words

reduce(combine_words, [["A", "B"], ["C", "D"], ["E", "F"]])

将return得到以下结果:

['ACE', 'ACF', 'ADE', 'ADF', 'BCE', 'BCF', 'BDE', 'BDF']

无论每个列表中的单词数量如何,或者无论总列表中的列表数量如何,它都有效。

itertools.product 正是您所需要的:

##separate lists
ls1 = ['A','B']
ls2 = ['C','D']
ls3 = ['E','F','G']
out = list(product(ls1,ls2,ls3))

##or, list of lists, using the * operator
ls = [['A','B'],['C','D'],['E','F','G']]
out = list(product(*ls))

##in both cases
print(out)
[('A', 'C', 'E'), ('A', 'C', 'F'), ('A', 'C', 'G'), ('A', 'D', 'E'), ('A', 'D', 'F'), ('A', 'D', 'G'), ('B', 'C', 'E'), ('B', 'C', 'F'), ('B', 'C', 'G'), ('B', 'D', 'E'), ('B', 'D', 'F'), ('B', 'D', 'G')]

原来是乘积问题而不是组合问题

因为 Python 字符串可以像字符列表一样进行迭代,这导致可以用多种方式来说明输入。 (我喜欢第三种方式,因为如果空格不在任何“单词”中,它可以减少输入)。

代码

from itertools import product
from typing import List, Union

def word_product(list_of_lists: Union[List[List[str]], List[str]]) -> str:
    return ', '.join(''.join(values) for values in product(*list_of_lists))

example1 = [["A", "B"], ["C", "D"], ["E", "F"]]
print(word_product(example1))

example2 = ["AB", "CD", "EF"]
print(word_product(example2))

example3 = "AB CD EF".split()
print(word_product(example3))

输出

每个等效示例输入都是同一行:

ACE, ACF, ADE, ADF, BCE, BCF, BDE, BDF
ACE, ACF, ADE, ADF, BCE, BCF, BDE, BDF
ACE, ACF, ADE, ADF, BCE, BCF, BDE, BDF