我有以下代码:
>>> 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
有没有更好的解决方案。
答案 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作为字符串导入,出于可读性原因,不能选择反序列化。