2016-08-14 7 views
0

私はPythonには新しく、辞書をテキストファイルに書き込む必要があるプロジェクトに取り組んでいます。フォーマットは次のようになります:リストに値のリストを含む辞書を、リスト内の各要素に対してキーが繰り返されたテキストファイルに書き込む

{'17': [('25', 5), ('23', 3)], '12': [('28', 3), ('22', 3)], '13': [('28', 3), ('23', 3)], '16': [('22', 3), ('21', 3)], '11': [('28', 3), ('29', 1)], '14': [('22', 3), ('23', 3)], '15': [('26', 2), ('24', 2)]}. 

ご覧のとおり、辞書の値は常にリストになります。私はテキストファイルに以下を書きます: 17,25,5 \ n 17,23,3 \ n 12、28,3 3 \ n 12,22,3 3 \ n 13、283 \ nは 13、23、3、\ nは ... \ nは改行を意味

の略で、キーは、これらのキーに「所属」というリスト内の各値に対して繰り返されます。その理由は、さらなる分析を行うためにテキストファイルをデータベースに再度読み込む必要があるからです。 過去数日間の回答を検索し、さまざまな方法で試してみましたが、この形式にすることはできません。あなたの誰かがこれに対する解決策を持っていることを感謝します。 ありがとう!

答えて

0

ハッシュの値があるtest.txt 2.

>>> f = open('test.txt', 'w') 
>>> for key,value in d.iteritems(): 
... for v in value: 
...  f.write(key + ' ' + v[0] + ' ' + str(v[1]) + '\n') 
... 
>>> f.close() 

値は

11, 28, 3 
11, 29, 1 
13, 28, 3 
13, 23, 3 
12, 28, 3 
12, 22, 3 
15, 26, 2 
15, 24, 2 
14, 22, 3 
14, 23, 3 
17, 25, 5 
17, 23, 3 
16, 22, 3 
16, 21, 3 
+0

リストには、実際には固定数の値がハッシュに含まれています。したがって、値の数を固定することはできません。しかし、あなたの方法は、私が推測している固定されていないリストでリストに変換できます。ご回答有難うございます! –

+0

はい、固定長でもメソッドを更新することができます。 –

0
>>> for k, v in data.items(): 
...  for t in v: 
...  print "%s, %s, %s" % ((k,) +t) 
... 
11, 28, 3 
11, 29, 1 
13, 28, 3 
13, 23, 3 
12, 28, 3 
12, 22, 3 
15, 26, 2 
15, 24, 2 
14, 22, 3 
14, 23, 3 
17, 25, 5 
17, 23, 3 
16, 22, 3 
16, 21, 3 
>>> 

まず、各キーと値(タプル)を取得します。次に、タプルをループし、各タプル値をキーで印刷します。辞書は順序付けされていないので、結果は辞書の順番にならない可能性があります。

+0

ブリリアントなりますサイズのタプルとリストで構成されてと仮定!まあそれは他人のために単純に見えます。しかし、私はこのような「シンプルな」構造コードでこれを実現することはできないと知りませんでした。多くのことを学ぶ!ありがとうジョエル金スティック! –

+0

これまでのところ、この方法はテストデータでうまく動作します。 Btw、私はこの方法を使って約2,000万のレコードをファイルに書きます。ディクショナリ内の各リストが5個未満の要素、すなわち外側ループは約400万個を含む。どれくらい時間がかかりますか分かりません。私は次にそれをテストします。しかし、私は外側のループが良い関心事ではないと思うそれはハッシュテーブルです。内部は5未満の限られた数です...時間の複雑さに関するコメント? –

0

辞書を文字列にダンプし、まず特定の順序を入れずにキーでソートする方法を示す実例です

data = { 
    '17': [('25', 5), ('23', 3)], 
    '12': [('28', 3), ('22', 3)], 
    '13': [('28', 3), ('23', 3)], 
    '16': [('22', 3), ('21', 3)], 
    '11': [('28', 3), ('29', 1)], 
    '14': [('22', 3), ('23', 3)], 
    '15': [('26', 2), ('24', 2)] 
} 

lines = [] 
for k, v in data.iteritems(): 
    for tupl in v: 
     row = [k] + map(lambda x: str(x), list(tupl)) 
     lines.append(', '.join(row)) 

output = '\n'.join(lines) 
print output 
print '-' * 80 

lines = [] 
for k, v in sorted(data.iteritems()): 
    for tupl in v: 
     row = [k] + map(lambda x: str(x), list(tupl)) 
     lines.append(', '.join(row)) 

sorted_output = '\n'.join(lines) 
print sorted_output 

EDIT:

data = { 
    '17': [('25', 5), ('23', 3)], 
    '12': [('28', 3), ('22', 3)], 
    '13': [('28', 3), ('23', 3)], 
    '16': [('22', 3), ('21', 3)], 
    '11': [('28', 3), ('29', 1)], 
    '14': [('22', 3), ('23', 3)], 
    '15': [('26', 2), ('24', 2)] 
} 

lines = [] 
for k, v in data.items(): 
    for tupl in v: 
     row = [k] + list(map(lambda x: str(x), list(tupl))) 
     lines.append(', '.join(row)) 

output = '\n'.join(lines) 
print(output) 
print('-' * 80) 

lines = [] 
for k, v in sorted(data.items()): 
    for tupl in v: 
     row = [k] + list(map(lambda x: str(x), list(tupl))) 
     lines.append(', '.join(row)) 

sorted_output = '\n'.join(lines) 
print(sorted_output) 

上記のコードはPython 2.xではで動作するように書かれていたが、ここでは3.xバージョンだあなたが望むものをアップ

+0

BPLの詳細な回答ありがとう!あなたの方法をテストしようとしています。しかし、私は以下のエラーがあります。バージョンの問題が原因であるかどうかは不明です。私はPython 3.5を使用しています。 トレースバック(最新の呼び出しの最後): ファイルSTR(:: 行= [K] +マップ(ラムダXの "E/Pythonのプロジェクト/マーチャント推薦/ 8月11日リリース/ test.py"、ライン14、 (マップされていない)リストを連結することができます –

+0

@ Zhicong Panそれは理にかなっています。あなたは最初にpython-3であなたの質問にタグを付けていませんでした。それは問題ではなかった。私はあなたにも3.xの幸運の作業ビットを与えるために私の答えを編集しました。 – BPL

+0

改訂版の回答をお寄せいただきありがとうございます!それは今完璧に動作します! –

関連する問題