我有数百万个表单字符串
"[(0, 1, 2), (3, 4, 5), (6, 7, 8)...]"
我需要将其转换为包含元组的 python 列表。我发现eval(这很糟糕而且很慢)并且ast.literal_eval速度更快,但是如果存在的话,我正在寻找更快的东西。不幸的是, usingjson.loads对我不起作用,因为由于括号,字符串在技术上不是有效的 JSON。
我有数百万个表单字符串
"[(0, 1, 2), (3, 4, 5), (6, 7, 8)...]"
我需要将其转换为包含元组的 python 列表。我发现eval(这很糟糕而且很慢)并且ast.literal_eval速度更快,但是如果存在的话,我正在寻找更快的东西。不幸的是, usingjson.loads对我不起作用,因为由于括号,字符串在技术上不是有效的 JSON。
json.loads()无法理解元组,但可以理解数组[]。我不知道这是最佳方法,但可以用来解决问题。
这里的诀窍是替换(by[和)by ]。
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)
我不知道 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