我有两个字符串列表。
letters = ['abc', 'def', 'ghi']
numbers = ['123', '456']
我想通过它们进行循环创建一个字符串列表,这个列表就是 不 平行,所以 zip()
在这里是行不通的。
希望的结果。
result = ['abc123', 'def123', 'ghi123', 'abc456', 'def456', 'ghi456']
结果中元素的顺序无关紧要。
有什么办法吗?
你可以试试 名单理解 嵌套两个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']
取以下产品 numbers
和 letters
(而不是 letters
和 numbers
),然后将得到的元组连接到 反面 顺序。
>>> 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')]
谢谢你的回答 我简化了案例,所以上面的解决方案都能很好地工作,然而在我正在处理的实际问题中,我想在中间添加更多的代码行,以迭代两个列表。我完成了它的嵌套那些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
变量之前的方式,看起来有点弱。
如果你切换到 名单理解 可以省去多余的那一行
result = [s+n for n in numbers for s in letters]
从数学上讲,你是在创造 笛卡尔积 的 numbers
和 letters
. Python提供了一个函数来实现这一目的,它是 itertools.product (顺便说一下,这也消除了双重 for
s)
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']