首页 > 解决方案 > 如何将列表中的字符串与列表理解结合起来?

问题描述

例如:

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 循环来实现?)

标签: pythonlistlist-comprehension

解决方案


您正在寻找的是这些序列的产物。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']

推荐阅读