11

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

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です。

どうすればそれを行うことができますか?Pythonのドキュメントを調べてみましたが、明確な解決策が見つかりませんでした。ありがとう!

4

4 に答える 4

17

最初にタプルを文字列に変換する必要があります。

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

もちろん、キーのタプルではなく文字列になります。

'{"(1, 2, 3)": ["a", "b", "c"], "(2, 6, 3)": [6, 3, 2]}'
于 2012-09-09T08:37:51.560 に答える
7

後でデータをロードする場合は、とにかく後処理する必要があります。したがって、私はただダンプし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')}
于 2012-09-09T09:38:55.040 に答える
0

Python 3* ユーザーの場合: @Martijn Pieters の回答に加えて、

dictonary.iteritems()は無効です。次のように置き換えてdictionary.items()ください:

json.dumps({str(k): v for k, v in data.items()})
于 2015-10-28T07:24:51.337 に答える