0

我有以下代码:

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

4 回答 4

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]})
于 2012-05-21T09:30:50.707 回答
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]})
于 2012-05-21T09:32:25.397 回答
1

你想序列化/反序列化对象吗?如果是这样,Pickle python 模块就是为你准备的。

于 2012-05-21T09:33:54.470 回答
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]})

我将 defaultdict 作为字符串从 excel 文件导入,出于可读性原因,反序列化不是一个选项。

于 2020-08-19T19:09:23.497 回答