将字典转换为字符串,将字符串转换为字典

时间:2012-05-21 09:24:26

标签: python

我有以下代码:

>>> 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

有没有更好的解决方案。

4 个答案:

答案 0 :(得分: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 :(得分: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]})

答案 2 :(得分:1)

您想序列化/反序列化对象吗?如果是这样,Pickle python module就是为您制作的。

答案 3 :(得分:0)

当无法将其以反序列化格式保存时,这是对我有用的解决方案:

from collections import defaultdict
import ast

teststring = "{'MATERIAL': ['a', 'b']}"
a = ast.literal_eval(teststring)
d = defaultdict(list,a)

print(d)

给予

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

我正在从excel文件中将defaultdict作为字符串导入,出于可读性原因,不能选择反序列化。