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 回答
1

您可以使用 ujson 模块。ujson.dumps() 接受元组作为字典中的键。您可以通过 pip 安装 ujson。

于 2015-12-10T14:33:19.243 回答
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 回答