形成两个字符串列表的笛卡尔积的大多数 Pythonic 方法

Most Pythonic way to form cartesian product of two lists of strings

我有两个字符串列表:

l1 = ["Col1", "Col2", "Col3"]
l2 = ["_ad1", "_ad2"]

我想将两个列表 l1 x l2 的笛卡尔积/串联成一个元素,即我想要的结果是:

["Col1_ad1", "Col1_ad2", "Col2_ad1", "Col2_ad2", "Col3_ad1", "Col1_ad1"]

当然我可以这样做:

result = []
for colname in l1:
    for suffix in l2:
        result.append(f"{colname}{suffix}")

但我想知道是否有更pythonic的方式?

编辑:我 不是 寻找一种更 pythonic 的方式来制定循环(即列表理解)。相反,我正在寻找一个内置函数,比如 concatenate(l1, l2) 产生了想要的结果

您可以使用列表理解:

print([f"{a}{b}" for a in l1 for b in l2])

您可以尝试列表理解:

>>> l1 = ["Col1", "Col2", "Col3"]
>>> l2 = ["_ad1", "_ad2"]
>>> [f"{a}{b}" for a in l1 for b in l2]
['Col1_ad1', 'Col1_ad2', 'Col2_ad1', 'Col2_ad2', 'Col3_ad1', 'Col3_ad2']

尝试列表理解:

print([x+y for x in l1 for y in l2])

您也可以使用格式字符串:

print(["{}{}".format(x,y) for x in l1 for y in l2])

仅适用于 python 3.6+(@AlexNomane 指出):

print([f"{x}{y}" for x in l1 for y in l2])

全部输出:

['Col1_ad1', 'Col1_ad2', 'Col2_ad1', 'Col2_ad2', 'Col3_ad1', 'Col3_ad2']

您可以使用 itertools.product

>>> from itertools import product
>>> l1 = ["Col1", "Col2", "Col3"]
>>> l2 = ["_ad1", "_ad2"]
>>> list(elem[0] + elem[1] for elem in product(l1, l2))
['Col1_ad1', 'Col1_ad2', 'Col2_ad1', 'Col2_ad2', 'Col3_ad1', 'Col3_ad2']