3

次のような単純な印刷コマンドで複数のdefaultdictをダンプしました。

defaultdict(<type 'list'>, {'actual': [20000.0, 19484.0, 19420.0], 'gold': [20000.0, 19484.0, 19464.0]})

それらを取得するために使用できる標準のパーサーはありますか?pickleを使用する必要があることは理解していますが、これらのdefaultdictを生成したコードは非常に遅いため、再実行は避けたいと思います。

4

3 に答える 3

6

defaultdict のタイプが always<type 'list'>の場合、次を使用できます。

from collections import defaultdict

s = """
defaultdict(<type 'list'>, {'actual': [20000.0, 19484.0, 19420.0], 'gold': [20000.0, 19484.0, 19464.0]})
"""
data = eval(s.replace("<type 'list'>", 'list'))

人々は、それは危険で悪質だと言うでしょeval()うが、誰かがあなたがダンプしたデータに有害なコードを挿入しようとしていた場合、おそらくあなたのソース コードを簡単に編集できてしまうでしょう。このデータを取得するテキスト ファイルがソース コードよりもアクセスしやすい場合は、この方法を使用しないことをお勧めします。

defaultdicts に複数の型があるが、それらがすべて組み込み型である (またはreprと型名の間で簡単に変換できる) 場合でも、このメソッドを複数の置換で使用できます。次に例を示します。

for rep, typ in ((repr(list), 'list'), (repr(dict), 'dict')):
    s = s.replace(rep, typ)
data = eval(s)
于 2012-06-12T17:22:00.093 に答える
2

完全に醜いですが、機能します:

s = """
defaultdict(<type 'list'>, {'actual': [20000.0, 19484.0, 19420.0], 'gold': [20000.0, 19484.0, 19464.0]})
"""

import re, ast

s = re.sub('^[^{]+', '', s)
s = re.sub('[^}]+$', '', s)

print ast.literal_eval(s)

dictこれにより、defaultdictではなくプレーンが作成されることに注意してください。

于 2012-06-12T17:15:00.507 に答える
0

独自のサブクラスを作成できます。

from collections import defaultdict

class mydefdict(defaultdict):
     def __repr__(self):
         return "mydefdict(%s, %s)" % (repr(self.default_factory()) + ".__class__", repr(dict(self)))

そして、それを他のタイプのように使用しますeval:

>>> d = mydefdict(list)
>>> d['foo'] = [1,2,3]
>>> d['bar']
[]
>>> print d
mydefdict([].__class__, {'foo': [1, 2, 3], 'bar': []})
>>> reprstring = repr(d)
>>> d2 = eval(reprstring)
>>> d2
mydefdict([].__class__, {'foo': [1, 2, 3], 'bar': []})

この方法を使用すると、一部が同じオブジェクトへの参照であっても、構造内のオブジェクト参照ごとに個別のコピーが作成されることに注意してください。

于 2012-06-12T18:03:57.547 に答える