如果我有两个字符串,'abc'
和 'def'
,我可以使用两个for循环来获取它们的所有组合:
for j in s1:
for k in s2:
print(j, k)
不过,我希望能够使用列表推导式来完成这个任务。我尝试了很多种方法,但从未成功过。有没有人知道如何做到这一点?
如果我有两个字符串,'abc'
和 'def'
,我可以使用两个for循环来获取它们的所有组合:
for j in s1:
for k in s2:
print(j, k)
不过,我希望能够使用列表推导式来完成这个任务。我尝试了很多种方法,但从未成功过。有没有人知道如何做到这一点?
lst = [j + k for j in s1 for k in s2]
或。lst = [(j, k) for j in s1 for k in s2]
如果您想要元组。
就像问题中所述,for j...
是外循环,for k...
是内循环。
基本上,在列表推导式中,您可以通过将一个 'for x in y' 子句紧接在另一个后面来拥有任意数量的独立子句。
为使其更易读,请使用多行:
lst = [
j + k # result
for j in s1 # for loop
for k in s2 # for loop
# condition
]
由于本质上这是一个笛卡尔积,因此您也可以使用itertools.product。我认为这更清晰,尤其是当您有更多的输入可迭代对象时。
itertools.product('abc', 'def', 'ghi')
from itertools import product
list(map(list, product('abc', 'def') ))
输出:
[['a', 'd'],
['a', 'e'],
['a', 'f'],
['b', 'd'],
['b', 'e'],
['b', 'f'],
['c', 'd'],
['c', 'e'],
['c', 'f']]
也尝试使用递归:
s=""
s1="abc"
s2="def"
def combinations(s,l):
if l==0:
print s
else:
combinations(s+s1[len(s1)-l],l-1)
combinations(s+s2[len(s2)-l],l-1)
combinations(s,len(s1))
提供给您8种组合:
abc
abf
aec
aef
dbc
dbf
dec
def
L1 = [[[e1, e2, ...], ...], ...]
->[ e for L2 in L1 for L3 in L2 for e in L3 ]
- AnOccasionalCashewfor
语句的顺序与将其写为两个独立行的for
循环相同。 - user3064538for k
(后者)成为外层循环,这与数学约定/自然语言一致。 - Shen Zhuoran