2012-05-21 48 views
0

我有以下代碼:轉換字典字符串,字符串與dict

>>> word_array = defaultdict(list) 
>>> word_array['first'].append(1) 
>>> word_array['first'].append(2) 
>>> word_array 
defaultdict(<type 'list'>, {'first': [1, 2]}) 

我把它轉換成字符串整個數據結構,但是當我試圖把它從字符串轉換,我不能,我得到如下:

>>> ast.literal_eval(str(word_array)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/ast.py", line 49, in literal_eval 
    node_or_string = parse(node_or_string, mode='eval') 
    File "/usr/lib/python2.7/ast.py", line 37, in parse 
    return compile(source, filename, mode, PyCF_ONLY_AST) 
    File "<unknown>", line 1 
    defaultdict(<type 'list'>, {'first': [1, 2]}) 
       ^
SyntaxError: invalid syntax 

有沒有更好的解決方案。

回答

1

所有你想在這裏做的是連載你的數據結構轉換爲字符串,然後反序列化這回的數據結構。不要在生產中使用諸如ast.literal_eval之類的東西。只需使用pickle

import pickle 
from collections import defaultdict 

word_array = defaultdict(list) 
word_array['first'].append(1) 
word_array['first'].append(2) 

s = pickle.dumps(word_array) 
other = pickle.loads(s) 

print other 

給出:

defaultdict(<type 'list'>, {'first': [1, 2]}) 
1

如果你不關心有它是在解碼一個defaultdict然後使用json。如果你照顧,那麼也可以用json,但是通過object_hook傳遞一個函數用於對象解碼。

>>> d = collections.defaultdict(list) 
>>> d['first'] = [1, 2] 
>>> json.dumps(d) 
'{"first": [1, 2]}' 
>>> json.loads('{"first": [1, 2]}') 
{u'first': [1, 2]} 
>>> def ddoh(d): 
... res = collections.defaultdict(list) 
... res.update(d) 
... return res 
... 
>>> json.loads('{"first": [1, 2]}', object_hook=ddoh) 
defaultdict(<type 'list'>, {u'first': [1, 2]})