web-dev-qa-db-ja.com

リスト内包表記を使用したネストされたForループ

2つの文字列がある場合、'abc'および'def'、2つのforループを使用して、それらのすべての組み合わせを取得できます。

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

ただし、リスト内包表記を使用してこれを実行できるようにしたいと思います。私は多くの方法を試しましたが、それをどうにかすることができませんでした。誰もこれを行う方法を知っていますか?

73
John Howard
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」句を次々に貼り付けるだけで作成できます。

117
aaronasterling

これは本質的にデカルト積なので、 itertools.product を使用することもできます。特により多くの反復可能な入力がある場合は、より明確だと思います。

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

再帰も試してください:

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
0