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

问题描述 投票:1回答:4

我有两个字符串列表。

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

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

希望的结果。

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

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

有什么办法吗?

python string list concatenation cartesian-product
4个回答
8
投票

你可以试试 名单理解 嵌套两个for循环 numbers 然后 letters :

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

您也可以使用 嵌套循环:

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

关于列表理解的更多细节,请参见《中国经济周刊》或《中国经济周刊》。文档 或者这个 相关话题.


1
投票

取以下产品 numbersletters (而不是 lettersnumbers),然后将得到的元组连接到 反面 顺序。

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

对于2-tuple。y + x 足够,而不是使用 ''.join.

两个列表的乘积是指从第一个列表中取出一个元素,再从第二个列表中取出一个元素,依次创建的所有可能的元组的集合。

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

0
投票

谢谢你的回答 我简化了案例,所以上面的解决方案都能很好地工作,然而在我正在处理的实际问题中,我想在中间添加更多的代码行,以迭代两个列表。我完成了它的嵌套那些for循环。

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

总之,非常感谢你的帮助!


0
投票

鉴于你的前缀列表 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 变量之前的方式,看起来有点弱。

高级

如果你切换到 名单理解 可以省去多余的那一行

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

专家

从数学上讲,你是在创造 笛卡尔积numbersletters. Python提供了一个函数来实现这一目的,它是 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']
© www.soinside.com 2019 - 2024. All rights reserved.