2012-04-02 8 views
3

初心者質問: 値が(可変数の)文字列のリストである辞書があります。最終的には、キーを列1として、個々の項目を値リストから列2-nとしてタブ区切りの1つの行に各辞書項目を書きたいと思います。私は次のコードを使用して、キーを列1、値リストを列2として出力ファイルを生成しましたが、そこから進める方法がわかりません。値を変数に持つタブ区切りファイルに値ペアを書く

mydict = {'spider':['kate', 'susan'], 
      'fish':['kate'], 
      'dog':['andy'], 
      'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t') 
for key, value in orfdict.iteritems(): 
    writer.writerow([orf] + [value]) 

Pythonドキュメントを使用すると、リスト形式のキーを作成するためにジッパーを()を使用することができますことを示唆している:値のペアを、私は対話プロンプトでこれをしようとすると:

>>> for key,value in mydict.iteritems(): 
...  mypair = zip(key,value) 
...  print mypair 

私はこの奇妙な出力を得ますので、私は明らかに私は物事を理解していないよ:

[('f', 'kate')] 
[('c', 'andy'), ('a', 'colby'), ('t', 'jeff')] 
[('s', 'kate'), ('p', 'susan')] 
[('d', 'andy')] 

が、これは、そのリストfに追加し、辞書を超える各反復のために空のリストを作成しようとして行うための最も簡単な方法ですキーを押してから、それぞれの値をインデントされたforループで戻しますか?私は何かが欠けているように感じる。

+0

これは、JSON、XMLおよびその他の構造化文書形式のために設計されたものです。なぜタブ区切りのCSVを使用する必要がありますか? – jozzas

+0

zipの「奇妙な出力」は、シーケンスが必要な文脈で文字列を取ると、文字列の個々の文字が得られることに注意して説明します。つまり、文字列は文字のリストのように動作します。だから、['andy'、 'colby'、 'jeff']で 'cat'を圧縮すると、catは['c'、 'a'、 't']に分割されます。 –

+0

@jozzas - 私はまだそれらのファイルタイプについて何も知らないので...しかし、私はそれらを "学習する"リストに加えました。ありがとう! – pandaSeq

答えて

5

既存のリストに単一の値を追加するために、これを試してみてください:

writer.writerow([key] + value) 

keyvalueがすでにリストである単一の値、である)

+0

ありがとう!私は角括弧の機能を実際に理解していませんでしたが、これは理にかなっています。 – pandaSeq

+0

角括弧は基本的にリストを作成します。したがって、 '[1,2,3]'は '1'、' 2'、 '3'の項目を持つリストを作成します。同様に、 '[key]'は単一の項目、 'key'でリストを作成します。そして、作成したリストをすでに存在するものと連結します。 – poke

0

次へループのためにあなたを変更してみてください:

for key, value in orfdict.iteritems(): 
    writer.writerow([key] + value) 

orfdictの値はリストなので、各繰り返しでvalueがリストになります。例えば、最初の反復でkey'spider'となり、value['kate', 'susan']となるため、[key] + value['spider'] + ['kate', 'susan']または['spider', 'kate', 'susan']になります。

0
>>> [(x, y) for x, x2 in mydict.iteritems() for y in x2] 
[('fish', 'kate'), ('cat', 'andy'), ('cat', 'colby'), ('cat', 'jeff'), ('spider', 'kate'), ('spider', 'susan'), ('dog', 'andy')] 
2

それはあなたがあなたの変数の一部に改名のように見える、と他の人の名前を変更していない、私はあなたが読むためにあなたの例のコードのためのものと仮定しています:

mydict = {'spider':['kate', 'susan'], 
      'fish':['kate'], 
      'dog':['andy'], 
      'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t') 
for key, value in mydict.iteritems(): 
    writer.writerow([key] + [value]) 

CSVライターはこの中で、不必要なようです場合は、使用しないでください:

mydict = {'spider':['kate', 'susan'], 
      'fish':['kate'], 
      'dog':['andy'], 
      'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
for key, value in mydict.iteritems(): 
    f.write('%s\t%s\n' % (key,'\t'.join(value))) 
f.close() 
+0

こんにちはキース、これは私が成功しなかったもののラインに沿っています。この場合、このコードでエラーが発生します:トレースバック(最新の最後の呼び出し): ファイル "/Users/zuma/scripts/stackoverflow.py"、行9、 f.write( '%s \ t% TypeError: 'NoneType'と 'tuple'に対してサポートされていないオペランドタイプ – pandaSeq

+0

私には2つのエラーがありました。コードをテストしました。私の謝罪です。コードは修正されました。 –

+0

受け入れられた答えとcsvライブラリの使用に対する公平さにおいて、dictオブジェクトの値にdelimeterと同じ値が含まれていると、正しく処理されます。言い換えれば、 'kate'が 'kate \ tand \ tjim'だった場合、私のコードは3つの列になるはずですが、csv応答は 'kate \ tand \ tjunk'二重引用符で囲みます。私はこれを指摘しています。なぜなら、csvをより活用したレスポンスが得られ、結果として得られるcsvファイルを読むときにあなたが探していることを確実にするために必要なものが追加されるからです。 –

関連する問題