2012-09-09 19 views
10

ile kesişen sözlüğü kaydetme Python'da küçük bir program yazıyorum ve (başlığı gibi) anahtarları ve değerleri tuple olan bir sözlük kullanıyorum.Anahtarları json, python

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

Sorun şu şekilde ben TypeError: keys must be a string almaya devam olup json kullanmaya çalışıyorum.

Bunu yapmayı nasıl yapabilirim? Python belgelerine bakmayı denedim ama net bir çözüm görmedim. Teşekkürler!

+5

Ancak JSON biçimi, dizelerin dizge olmasını gerektirir ... – kennytm

+0

Bunu bir Dize olarak ayrıştırabilir miyim? – Yotam

+0

Neden anahtar olarak anahtarlara ihtiyacınız var? – seriousdev

cevap

12
Önce dizeleri için dizilerini dönüştürmek gerekir

:

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

, sen anahtarları için dizeleri yerine küpe ile bitireceğiz:

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

Bu eylemin nasıl tersine çevrileceğini bilmek ilginç olurdu. –

+3

@RickyRobinson: 'ast.literal_eval()', Python değerini dizeden yeniden oluşturacaktır. –

+1

Bu benim için python3 çalıştı: converted = {ast.literal_eval (k): k için v, json.items() içinde v – Johan

5

Eğer isterseniz Verilerinizi daha sonra yüklemeniz gerekecek. Bu nedenle ben sadece data.items() dökümü ediyorum:

>>> 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 için

* kullanıcıları: @Martijn Pieters cevap ilaveten,

dictonary.iteritems() geçerli değil, dictionary.items() ile değiştirin:

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

ujson modülünü kullanabilirsiniz. ujson.dumps(), tuplları bir sözlükte anahtar olarak kabul eder. Ujson'u pip ile kurabilirsiniz.