2

名前付きタプルの文字列をリストに変換するにはどうすればよいですか?

問題は、名前付きタプルのリストを SQLite の列に格納する必要があることです。これは (明らかに) 形式をサポートしていません。文字列に変換するだけだと思いました。ただし、私のタプルは名前付きタプルなので、文字列からリストに再度移動する方法がわかりません。

>>> Point = namedtuple("Point", "x y", verbose = False)
>>> p = Point(3, 5)
>>> points = []
>>> points.append(Point(4, 7))
>>> points.append(Point(8, 9))
>>> points.append(p)
>>> p.x
3
>>> print points
[Point(x=4, y=7), Point(x=8, y=9), Point(x=3, y=5)]

私の名前付きタプルのリストはこのようなものです^^^^ ですが、上記の 2 つではなく 6 つの引数があります。編集 - 引数はブール値、int、および文字列です。

マッピングを試みましたが、次のエラーが発生しました。

>>> string = str(points)
>>> l = string.strip("[]")
>>> p = map(Point._make, l.split(", "))

Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
p = map(Point._make, l.split(", "))
File "<string>", line 17, in _make
TypeError: Expected 2 arguments, got 9

これを行うための他のより簡単な方法を受け入れます。

4

3 に答える 3

3

最終的に、これを行う方法は好みの問題かもしれません。

JSON

Json は、pickle とは異なり、Python を超えて使用できるため、適切に使用できます。オブジェクトは、広くサポートされ、簡単に転用できる形式でシリアル化されます。

>>> import json  # simple json is better bit I didn't want to force an install
>>> from collections import namedtuple
>>> Point = namedtuple("Point", "x y", verbose = False)
>>> p = Point(3,4)
>>> json.dumps(p._asdict())
'{"x": 3, "y": 4}'
>>> s = json.dumps(p._asdict())
>>> json.loads(s)  # not there yet cause thisis a dict
{u'y': 4, u'x': 3}   # but it is a dict that can create a Point
>>> Point(**json.loads(s))
Point(x=3, y=4)    

ピクルス

属性の状態を定義しない限り、pickle は機能しません (__getstate__ ドキュメントを参照)。これは、上から順に、ロード フェーズの "Nicer" です。

import pickle

# Point.__getstate__=lambda self: self._asdict() # not needed as per @simon's comment thx simon
>>> pickle.dumps(p)
"ccopy_reg\n_reconstructor\np0\n(c__main__\nPoint\np1\nc__builtin__\ntuple\np2\n(I3\nI4\ntp3\ntp4\nRp5\nccollections\nOrderedDict\np6\n((lp7\n(lp8\nS'x'\np9\naI3\naa(lp10\nS'y'\np11\naI4\naatp12\nRp13\nb."
s = pickle.dumps(p)
>>> pickle.loads(s)
Point(x=3, y=4)

評価

eval や exec の使用はお勧めしません。そのルートをたどる場合は、python evalの安全性ast.literal_eval()など、SO関連の回答のいくつかをチェックアウトしてチェックアウトします

于 2013-07-28T14:17:33.510 に答える
2

picklePythonオブジェクトをファイルに保存できるようなモジュールを使用することをお勧めします。

ちなみに、 でnamedtuple動作するかどうかはわかりません。pickleその場合で、データのソースが不明でない場合は、 で使用することもできevalますrepr

ヘルプrepr:

>>> print repr.__doc__
repr(object) -> string

Return the canonical string representation of the object.
For most object types, eval(repr(object)) == object.

例:

>>> repr(points)
'[Point(x=4, y=7), Point(x=8, y=9), Point(x=3, y=5)]'
>>> eval(repr(points))
[Point(x=4, y=7), Point(x=8, y=9), Point(x=3, y=5)]
于 2013-07-28T13:53:16.357 に答える