2016-04-19 21 views
0

私はこのような出力を得るためにPythonで2つのリストをループしようとしています。カーテシアンプロダクトを生成するために、Pythonのネストされたループ

list1 = [a, b, c] 
list2 = [1, 2, 3] 

だからべきリスト上LIST1の各値についてループ2 LIST1 [A]がループ3回LIST2上など、それがCに到達するまで。しかし、私は希望の出力を得ていません。

i='' 
list1 = ['ABC ' + str(i)+ ' '+'1' + ' ' + '5', 'CDE '+ str(i)+ ' '+ '1'+ ' ' + '5'] 
list2=['123','234','456'] 
for c in list1: 
     for i in list2: 
       print c 

出力:

ABC 1 5 
ABC 1 5 
ABC 1 5 
CDE 1 5 
CDE 1 5 
CDE 1 5 

中から所望のプットは以下のようにする必要があります:

ABC 123 1 5 
CDE 123 1 5 
ABC 234 1 5 
CDE 234 1 5 
ABC 456 1 5 
CDE 456 1 5 

は、私がここで行方不明です何私を導いこれに新しいですしてください。

答えて

3

ループ内でlist2の値を補間する必要があります。ループを入れ子にするのではなく、itertools.product() functionにすることができます。あなたはalterateにlist1の値をしたい場合は、リストの順番を入れ替えるん:

from itertools import product 

list1 = ['ABC {} 1 5', 'CDE {} 1 5'] 
list2 = ['123','234','456'] 
for l2, l1 in product(list2, list1): 
    print l1.format(l2) 

str.format() methodは、あなたがゼロから毎回list2を再構築することを避けるせ、あなたのl2値でlist1文字列で{}を埋めます:

>>> for l2, l1 in product(list2, list1): 
...  print(l1.format(l2)) 
... 
ABC 123 1 5 
CDE 123 1 5 
ABC 234 1 5 
CDE 234 1 5 
ABC 456 1 5 
CDE 456 1 5 

別の方法としては、タプル使用する値のを含むことlist1のためである、とあなたは1回目にすべてを変換し印刷する場合にのみ機能(Pythonの3、またはPythonの2のfrom __future__インポート)としてprint()を使用して、リング:

from __future__ import print_function 

list1 = [('ABC', 1, 5), ('CDE', 1, 5)] 
list2 = ['123','234','456'] 
for l2, (a, b, c) in product(list2, list1): 
    print(a, l2, b, c) 

は、それはあなたが生成される値でやりたい他に何に依存します。

5の数値がlist1の値の間で変更されていない場合、文字列テンプレートまたはタプルで複雑なダンスを行う必要はありません。あなただけのループの中にあるものを参照したい:

b, c = 1, 5 
list1 = ['ABC', 'CDE'] 
list2 = ['123','234','456'] 
for l2, l1 in product(list2, list1): 
    print '{} {} {} {}'.format(l1, l2, b, c) 

私はまだちょうど1つの文字列に複数の値を組み合わせる別のフォームを表示する文字列フォーマットを使用します。

1

list1の構築をforループに移す必要があります。次のように行を再編成:

list2 = ['123', '234', '456'] 

for i in list2: 
    list1 = ['ABC ' + str(i) + ' ' + '1' + ' ' + '5', 
      'CDE ' + str(i) + ' ' + '1' + ' ' + '5'] 
    for c in list1: 
     print c 

これは言われていること

ABC 123 1 5 
CDE 123 1 5 
ABC 234 1 5 
CDE 234 1 5 
ABC 456 1 5 
CDE 456 1 5 

を印刷しますが、これはstring formattingを使用して改善することができます。

for i in list2: 
    list1 = ['ABC {0} 1 5', 'CDE {0} 1 5'] 
    for c in list1: 
     print c.format(i) 
+0

文字列のテンプレートを使用しないのはなぜ? –

+0

@MartijnPieters私は、OPsコードのエラーを指摘して、何が間違っているのかを理解しました。私は改良版を投稿しようとしていましたが、あなたはすでに私にそれを打ち明けました。 – Selcuk

+0

とにかく編集を続けてください!将来の訪問者はおそらく別の視点に感謝するでしょう。 –

関連する問題