2017-08-25 12 views
0

mapとitertoolsを使用して外部製品の結果をファイルに出力しようとしていますが、なぜこのエラーがインデックスエラーを引き起こすのか理解しがたいです。文字列の整形itertools出力 - タプルの範囲外エラー

import itertools 
a = [1,2,3] 
b = [4,5,6] 
with open('job.list', 'w') as l: 
    map(lambda x: l.write("{0} {1}\n".format(x)), itertools.product(a, b)) 

map(lambda x: l.write("{0} {1}\n".format(x[0], x[1])), itertools.product(a, b)) 

にマップを変更するには、エラーを削除しますが、これは明らかに不完全です。

このエラーはitertools.productがリストではなくイテレータを返すことと関係があると思います。しかし、試行してください

代わりにインデックスエラーが発生します。

ここに私の理解に間隙があることは明らかですが、私はそれが何であるかを知るために何か助けてもらえます。

+2

'map'と' lambda'でこれを行う理由はありますか?より読みやすい 'for'ループでこれを行うことができるようです。 – roganjosh

+0

'map(lambda x:l.write(" {0} {1} \ n ".format(* x))、itertools.product(a、b))'あなたは何をしますか? – roganjosh

+0

HPCに行く特定のジョブのために、かなり動かすことができる入力ジェネレータスクリプトです。私は一度実行します。学習の練習として、マップとラムダを使ってできるだけ簡潔に書くようにしました。これが他の誰かに行くことになった場合や、この1つ以上の実行に使用された場合は、より読みやすいソリューションを使用することに同意します。いずれにせよ、私は私の誤りを理解したいと思います。 – JFurness

答えて

0

format"{0} {1}\n".format(x)には、{0}{1}に2つの値が挿入されると予想されます。しかし、あなたは1つだけを提供します - x - それはiterableの個々の項目を使うべきであることを知らない。代わりに、あなたはタプルを解凍するスプラット演算子*を使用することができます。

map(lambda x: l.write("{0} {1}\n".format(*x)), itertools.product(a, b)) 
0

それらが一致するようにするには、引数またはフォーマット文字列を調整することができます。前者のアプローチは@roganjoshによって投稿されました。これは後者の代替手段です:

"{0[0]} {0[1]}\n".format(x) 
+0

これは興味深いです。私はフォーマット指定がコレクション要素のインデックスを付けることができないことを認識していました。また、これは辞書のキーでも機能することがわかりました。ありがとう! – JFurness

関連する問題