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

问题描述 投票:0回答:2

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

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

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

python-3.x parsing eval
2个回答
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

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)
© www.soinside.com 2019 - 2024. All rights reserved.