2

文字列のリストを正しい型 (int、float、boolean など) に 1 行で変換し、値をアンパックしたいと考えています。

以下よりもこれを達成できる組み込みモジュールはありますか?:

strLst = ["a", "1.0", "2", "True"]
a, b, c, d = [[s[0], float(s[1]), int(s[2]), bool(s[3])] for s in [strLst]][0]

編集:

大きなテキスト ファイルから a、b、c、d を作成していますが、1 行で変換するエレガントな方法があることを期待していました。これは、この特定の例に対する単なる質問ではなく、次のようなことを達成できるモジュールに関する質問です。

with open("file.txt") as f:
    a, b, c, d = [[s[0], float(s[1]), int(s[2]), bool(s[3])] \
                       for s in [next(f)[:-1].split()]][0]

Niclas Nilsson のコメントに基づいて、次のことができます。

a,b,c,d = [ast.literal_eval(s) for s in next(f)[:-1].split()]
4

2 に答える 2

1

質問が古すぎることは知っています。しかし、私の最初の質問は、なぜワンライナーでなければならないのですか? つまり、ソリューションに100行かかる場合でも、いつでもそれらを関数の下に配置して、他の場所で関数を呼び出すことができるので、ソリューションはワンライナーになりますよね?

速度が必要な場合は、提案されているよりも高速でシンプルなツーライナーを思いつきました.

for row in StringIO('a 1.0 2 True\n' * 32):# Took the idea from derek's answer
    (a, b, c, d) = row.split(" ", 3)
    b, c, d = float(b), int(c), 'True' in d

前述したように、これを使用できず、ワンライナーが絶対に必要な場合は、いつでも次のようにすることができます。

def string_to_multiple_type_list(data):
    multi_list = []
    for line in data.split("\n"):
        a, b, c, d = line.split(" ", 3)
        multi_list.append([a, float(b), int(c), 'True' in d])
    return multi_list

そして、変換された値が必要なときはいつでも、ワンライナーとして呼び出すことができます:

new_multi_list = string_to_multiple_type_list(data)

関数呼び出しには少し時間がかかりますが (間違いなくマイクロ秒単位)、zip を使用するよりも高速でエレガントです。

derek のテスト コードを借りると、このユーザー定義関数で 20% の時間短縮、2 ライナーの場合で 30% の時間短縮が見られました。

于 2013-06-18T09:55:03.550 に答える