如何从两个列表的笛卡尔积中连接字符串

How to join strings from a Cartesian product of two lists

我有两个字符串列表:

letters = ['abc', 'def', 'ghi']
numbers = ['123', '456']

我想通过它们循环创建一个平行的字符串列表,所以zip()在这里不起作用。

期望的结果:

result = ['abc123', 'def123', 'ghi123', 'abc456', 'def456', 'ghi456']

结果中元素的顺序无关紧要。

有什么想法吗?

numbersletters 的乘积(而不是 lettersnumbers),然后在 reverse订单。

>>> from itertools import product
>>> [''.join([y, x]) for x, y in product(numbers, letters)]
['abc123', 'def123', 'ghi123', 'abc456', 'def456', 'ghi456']

对于 2 元组,y + x 就足够了,而不是使用 ''.join

两个列表的乘积就是所有可能的元组的集合,这些元组是通过按顺序从第一个列表中获取一个元素和从第二个列表中获取一个元素而创建的。

>>> list(product(numbers, letters))
[('123', 'abc'), ('123', 'def'), ('123', 'ghi'), ('456', 'abc'), ('456', 'def'), ('456', 'ghi')]

您可以尝试 list comprehension 并在 numbers 上使用两个嵌套 for 循环,然后 letters :

print([l+n for n in numbers for l in letters])
# ['abc123', 'def123', 'ghi123', 'abc456', 'def456', 'ghi456']

您还可以使用嵌套for循环:

out = []
for n in numbers:
    for l in letters:
        out.append(l+n)
print(out)
# ['abc123', 'def123', 'ghi123', 'abc456', 'def456', 'ghi456']

有关列表理解的更多详细信息,请参阅 doc or this related topic

感谢您的回答!我简化了案例,因此上述所有解决方案都运行良好,但是在我正在处理的实际问题中,我想在两者之间添加更多代码行,这些代码将遍历两个列表。我完成了嵌套那些 for 循环:

for letter in letters:
   for number in numbers:
      print(letter+number)
      # many many lines of more code

无论如何,非常感谢您的帮助!

鉴于您的前缀列表 letters 和后缀 numbers 必须合并

letters = ['abc', 'def', 'ghi']
numbers = ['123', '456']

基本

想到的第一个解决方案(尤其是如果您是 Python 的新手)是使用嵌套循环

result = []
for s in letters:
    for n in numbers:
        result.append(s+n)

并且因为 - 如您所说 - 顺序无关紧要,以下也是有效的解决方案

result = []
for n in numbers:
    for s in letters:
        result.append(s+n)

两者最重要的缺点是您需要先以一种看起来有点弱的方式定义 result 变量。

高级

如果你切换到 list comprehension 你可以去掉那条额外的线

result = [s+n for n in numbers for s in letters]

专家

从数学上讲,您正在创建 Cartesian product of numbers and letters. Python provides a function for exact that purpose by itertools.product(顺便说一句,这也消除了双重 fors)

from itertools import product
result = [''.join(p) for p in product(letters, numbers)]

在您的示例中,这可能看起来有点矫枉过正,但一旦涉及到用于构建结果的更多组件,可能就会有很大的不同,这里介绍的所有工具,但 itertools.product 都将趋于爆炸式增长然后。

为了说明,我以一个遍历前缀、中缀和后缀的示例作为结尾:

print([''.join(p) for p in product('ab', '+-', '12')])

给出了这个输出:

['a+1', 'a+2', 'a-1', 'a-2', 'b+1', 'b+2', 'b-1', 'b-2']