将字符串转换为元组列表的最快方法

时间:2019-10-28 11:06:35

标签: python-3.x parsing eval

我有数百万个格式的字符串

"[(0, 1, 2), (3, 4, 5), (6, 7, 8)...]"

我需要将其转换为包含元组的python列表。我发现eval(不好而且很慢)和ast.literal_eval有点快,但是我正在寻找更快的东西(如果存在)。不幸的是,json.loads对我不起作用,因为由于括号的原因,字符串在技术上不是有效的JSON。

2 个答案:

答案 0 :(得分:0)

我不知道ipython timeit魔术方法的准确性如何,但以下结果似乎足够好:

In [28]: s = "[(0, 1, 2), (3, 4, 5), (6, 7, 8)]"

In [29]: %timeit l = eval(s)
100000 loops, best of 3: 12.4 µs per loop

In [30]: %timeit l = ast.literal_eval(s)
10000 loops, best of 3: 21.2 µs per loop

In [31]: %timeit l = [tuple(x) for x in json.loads(s.replace('(', '[').replace(')', ']'))]
The slowest run took 6.04 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.8 µs per loop

答案 1 :(得分:0)

json.loads()无法理解元组,但可以理解数组[]。 我不知道这是最佳方法,但是可以用来解决问题。

这里的技巧是将(替换为[,将)替换为]

import json

data = "[(1,2,3),(4,5,6)]"

data = data.replace("(", "[")
data = data.replace(")", "]")

data = json.loads(data)

tuple_list = []
for t in data :
  tuple_list.append(tuple(t))

print(tuple_list)