1

トークンのリストとそれらのトークンの適切な既知のタイプ表現が与えられた場合、タイプをリストにマップするにはどうすればよいですか?タイプがint'sの場合、または文字列をfloats呼び出しint(x)て値をintに変換できますが、タイプがa list(またはと言うnumpy.array)の場合は失敗します。変換を行うための最もPython的な方法は何ですか?evalデータは基本的にサニタイズされていないため、ここではオプションではありません。例:

line     = "0 0 62.9695 [16.859,-17.1135,46.6351] [7.1759,29.3009,83.1399]"
tokens   = line.split()
type_key = [int,int,float,list,list] # Lists do not convert properly here

print [T(x) for T,x in zip(type_key,tokens)]

関連:Pythonで複数のタイプのリストをバイナリに変換する方法は?

4

2 に答える 2

8

あなたが欲しいのはast.literal_eval()、この目的のために設計されたです。

>>> ast.literal_eval("[16.859,-17.1135,46.6351]")
[16.859, -17.1135, 46.6351]

編集:あなたのコメントの問題に従って:

def literal_eval_to_array(literal):
    return np.array(ast.literal_eval(literal))

次に、で簡単に使用できます。関数呼び出しとインスタンス化はPythonと同じであることに注意literal_eval_to_array()してください。type_key

于 2012-10-25T14:39:45.363 に答える
1

タイプからコンバーター関数へのマップを作成するのが最善の方法だと思います。そうすれば、必要なだけ複雑なコンバーターを作成できます。

import ast
def convert_list(str_val):
    return ast.literal_eval(str_val)

def convert_array(str_val):
    # do something here
    return []

converter_map = {
    list: convert_list,
    'np.array': convert_array
}

def convert(str_val, _type):
    converter = _type
    if _type in converter_map:
        converter = converter_map[_type]
    return converter(str_val)

line     = "0 0 62.9695 [16.859,-17.1135,46.6351] [7.1759,29.3009,83.1399]"
type_key = [int,int,float,list,list] 

print [convert(v, t) for v, t in zip(line.split(), type_key)]

出力:

[0, 0, 62.969499999999996, [16.859000000000002, -17.113499999999998, 46.635100000000001], [7.1759000000000004, 29.300899999999999, 83.139899999999997]]

これにより、非常に柔軟なスキームになり、入力を非常に柔軟な方法でサニタイズおよび処理できます。

于 2012-10-25T15:00:04.713 に答える