2012-09-09 83 views
10

私はPythonで少しのプログラムを書いていますが、(タイトルのように)キーと値がタプルである辞書を使用しています。キーがjsonであるタプルの辞書を保存する、python

import json 
data = {(1,2,3):(a,b,c),(2,6,3):(6,3,2)} 
print json.dumps(data) 

問題を次のように私はTypeError: keys must be a stringを得続けるでJSONを使用しようとしています。

どうすればいいですか?私はPythonのドキュメントを見てみましたが、明確な解決策は見当たりませんでした。ありがとう!あなたが最初の文字列にあなたのタプルを変換する必要があります

+5

JSON形式ではキーが文字列である必要があります... – kennytm

+0

それを文字列として解析することはできますか? – Yotam

+0

なぜタプルがキーとして必要ですか? – seriousdev

答えて

12

:あなたがしたい場合は

'{"(1, 2, 3)": ["a", "b", "c"], "(2, 6, 3)": [6, 3, 2]}' 
+0

この動作を逆にする方法を知ることは興味深いでしょう。 –

+3

@RickyRobinson: 'ast.literal_eval()'は、文字列からPythonの値を再構成します。 –

+1

これはpython3で私のために働いた:converted = {ast.literal_eval(k):vのk、vのjson.items()} – Johan

5

:もちろん

json.dumps({str(k): v for k, v in data.iteritems()}) 

、あなたは、文字列の代わりに、キーの組になってしまいますとにかく後処理しなければならないデータを後で読み込んでください。したがって、私はちょうどdata.items()をダンプしたい:

>>> import json 
>>> a, b, c = "abc" 
>>> data = {(1,2,3):(a,b,c), (2,6,3):(6,3,2)} 
>>> on_disk = json.dumps(data.items()) 
>>> on_disk 
'[[[2, 6, 3], [6, 3, 2]], [[1, 2, 3], ["a", "b", "c"]]]' 
>>> data_restored = dict(map(tuple, kv) for kv in json.loads(on_disk)) 
>>> data_restored 
{(2, 6, 3): (6, 3, 2), (1, 2, 3): (u'a', u'b', u'c')} 
0
Pythonの3のために

*ユーザーを: を@Martijnピータース応答に加えて、

dictonary.iteritems()が有効ではありません、dictionary.items()に置き換えます

json.dumps({str(k): v for k, v in data.items()}) 
0

ujsonモジュールを使用できます。 ujson.dumps()は、タプルを辞書のキーとして受け入れます。 ujsonはpipでインストールできます。

関連する問題