使用列表理解嵌套循环


85

如果我有两个字符串'abc''def',则可以使用两个for循环获取它们的所有组合:

for j in s1:
  for k in s2:
    print(j, k)

但是,我希望能够使用列表理解来做到这一点。我已经尝试了许多方法,但是从未尝试过。有谁知道如何做到这一点?

Answers:


133
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”子句,只需一个接一个地坚持。


1
如果要执行嵌套循环以遍历嵌套列表怎么办?像这样的东西:[print('a')for axs in axs轴中的axs]在[none,None ...]上打印一堆直到len(axes)
Pablo Ruiz Ruiz

@Pablo我认为您的循环已反转。L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew,

for语句的顺序与您for在两个单独的行上将其编写为两个循环的顺序相同。
鲍里斯

我可以在下面使用条件语句吗?
Salik Malik

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]或什么
Salik Malik

34

由于这本质上是笛卡尔积,因此您也可以使用itertools.product。我认为这更清楚,尤其是当您有更多输入可迭代项时。

itertools.product('abc', 'def', 'ghi')

0

也尝试递归:

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

根据OP的问题,我认为输出应给出几个字母,并且应该有9个组合。
Mattia

发生了什么:abd,abe,acd,ace,acf,adb,adc,ade,adf,aeb,aed,afb,afc,afd,afe,以及所有以c,e或f开头的字符?即使顺序并不重要,省略分别是:北京经济技术开发区,ADE等
哈利宾斯瓦格

这种方法的工作方式是,最左边的位置只能是“ a”或“ d”,中间的位置只能是“ b”或“ e”,而右边的位置只能是“ c”或“ f” 。
Stefan Gruenwald,2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.