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


88

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

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

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

回答:


136
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 iny'句を含めることができます。


1
ネストされたリストを反復処理するためにネストされたループを実行する場合はどうなりますか?次のようなもの:[print( 'a')for axs in axs for axs in axis]は、[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ステートメントの順序は、for2つの別々の行に2つのループとして記述した場合と同じです。
ボリス

aaronasterling次の条件文を使用できますか?
SalikMalik20年

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]または何か
SalikMalik20年

35

これは本質的にデカルト積であるため、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の質問によると、出力には2文字の文字が含まれているはずであり、9つの組み合わせがあるはずです。
マティア2015

何が起こったのですか:abd、abe、acd、ace、acf、adb、adc、ade、adf、aeb、aed、afb、afc、afd、afe、およびc、e、またはfで始まるすべてのもの?順序が重要でない場合でも、省略されているのは次のとおりです。bda、adeなど
Harry Binswanger

これが機能する方法は、左端の位置は「a」または「d」のみ、中央の位置は「b」または「e」のみ、右位置は「c」または「f」のみであるということです。 。
Stefan Gruenwald 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.