2017-12-01 5 views
1

私はCSVコンテンツを含む文字列を持っています。私はそうのようなリストにそれを回した:Pythonでリストを2回ループする方法

from StringIO import StringIO 
import csv 

f = StringIO(list_csv) 
my_list = csv.reader(f, delimiter=',') 

は、今私は、リストの上に二回ループしたいのですが、リストが空であるかのように、私はループにしようと二回目は、コードが通り抜ける:

for item in my_list: 
    code = item[1] 
    print "code: "+code 

for item in my_list: 
    desc = item[2] 
    print "desc: "+desc 

(このコードはデモンストレーションの目的のために簡略化されて、私は単一のループで実行を組み合わせることはできません)

私は、リストがまだれたStringIOに取り付けられており、それはそれは読んで行うのループ完了だとき、それは勝った考え出しもう一度読んでください。それをメモリ内の通常のリストに変換するための1つのライナーがありますか?何度かループすることができますか?手動で値をコピーするループを実行しているように感じるのは、ホイールを再発明することです...しかし、他のオプションがない場合、私はそれを行うことができます。ちょっと長めのコードワイズを求めているだけです。ありがとう!

+1

my_listというおそらく 'new_list' –

+0

おかげにわたってこの' new_list =リスト(my_listという) 'とループのようなリストに変換し、リーダ・オブジェクトです。答えとして投稿したはずです。 ;)ええ....それは私が今Pythonでnewbの方法です。 :$ – msb

答えて

4

問題はmy_listは実際にはリストではないということです。これはiteratorです(この特定のケースでは実際にはreader objectであり、これは単なるイテレータの一種です)。

イテレータは、最初にすべての値が生成された後に消費されます。これは、mylistに起こっていることです。最初にループした後、リーダーオブジェクトは既に消費されており、再度反復することはできません。

解決策の1つは、実際のlistオブジェクトに内容を格納することです。これで解決する必要があります:

my_list = list(csv.reader(f, delimiter=',')) 

...これまでと同様に処理してください。ところで

あなたは、Python 3の最新バージョンを使用している場合は、リストにイテレータを開梱ために利用可能な、本当に素敵な構文があります:

my_list = [*csv.reader(f, delimiter=',')] 
0

使用この次のコード:

my_list = list(csv.reader(f, delimiter=',')) 
0

itertoolsでtee関数を使用します。これにより、一度だけでなく、より多くのアクセスをイテレータに提供できます。

from itertools import tee 

i1, i2 = tee(my_list) 

for i in i1: 
    pass 

for i in i2: 
    pass 
関連する問題