[英]Convert strings of list to list of integers inside a list
我有一个字符串列表,这些字符串是列表。 像这样: ['[1,2,3]','[10,12,5]']
,例如。 我想获取列表列表,甚至那里的每个列表:
[[1,2,3],[10,12,5]]
您应该使用literal_eval从string
获取实际的list
对象。
>>> from ast import literal_eval
>>> data = ['[1,2,3]','[10,12,5]']
>>> data = [literal_eval(each) for each in data]
>>> data
[[1, 2, 3], [10, 12, 5]]
literal_eval
安全地评估每个对象。
>>> help(literal_eval)
Help on function literal_eval in module ast:
literal_eval(node_or_string)
Safely evaluate an expression node or a string containing a Python
expression. The string or node provided may only consist of the following
Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
and None.
您应该始终避免使用eval
函数。 在这里阅读更多。
您可以使用ast.literal_eval
,通常应避免使用eval
:
l= ['[1,2,3]','[10,12,5]']
from ast import literal_eval
print([literal_eval(ele) for ele in l])
[[1, 2, 3], [10, 12, 5]]
或索引,拆分和映射:
print([list(map(int,ele[1:-1].split(","))) for ele in l])
[[1, 2, 3], [10, 12, 5]]
如果您始终使用相同的格式拆分,那么最有效的解决方案是:
In [44]: %%timeit
l= ['[1,2,3]','[10,12,5]']
l = [choice(l) for _ in range(1000)]
[eval(ele) for ele in l]
....:
100 loops, best of 3: 8.15 ms per loop
In [45]: %%timeit
l= ['[1,2,3]','[10,12,5]']
l = [choice(l) for _ in range(1000)]
[literal_eval(ele) for ele in l]
....:
100 loops, best of 3: 11.4 ms per loop
In [46]: %%timeit
l= ['[1,2,3]','[10,12,5]']
l = [choice(l) for _ in range(1000)]
[list(map(int,ele[1:-1].split(","))) for ele in l]
....:
100 loops, best of 3: 2.07 ms per loop
import ast
l = ['[1,2,3]','[10,12,5]']
l = [ast.literal_eval(i) for i in l]
通常不建议这样做,但是您可以对每个字符串使用eval
:
fun = ['[1,2,3]','[10,12,5]']
listy = [eval(x) for x in fun]
输出:
[[1, 2, 3], [10, 12, 5]]
这个问题为为什么使用eval
可能是个坏主意提供了很好的理由。 我只是在这里介绍它作为一种选择。 eval
可能会带来很大的安全风险,因为您正在为用户提供Python解释器的全部功能。 此外,它违反了编程的基本原则之一,该原则指出, 所有可执行代码都应直接映射到源代码。 使用eval
评估用户输入会导致显然不在您的源代码中的可执行代码。
最好使用ast.literal_eval()
, Padraic Cunningham的答案针对如何有效使用它。
使用正则表达式:
new_list = [[int(j) for j in re.findall(r'\d+', i)] for i in old_list]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.