我有一个字符串列表,这些字符串是列表。像这样:['[1,2,3]','[10,12,5]']
,例如。我想得到一份清单,甚至是每个清单:
[[1,2,3],[10,12,5]]
答案 0 :(得分:2)
您应该使用literal_eval从list
获取实际string
个对象。
>>> 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
功能。阅读更多here。
答案 1 :(得分:1)
您可以使用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
答案 2 :(得分:1)
import ast
l = ['[1,2,3]','[10,12,5]']
l = [ast.literal_eval(i) for i in l]
答案 3 :(得分:0)
通常不推荐,但您可以对每个字符串使用eval
:
fun = ['[1,2,3]','[10,12,5]']
listy = [eval(x) for x in fun]
<强>输出:强>
[[1, 2, 3], [10, 12, 5]]
This question提供了很好的理由,说明为什么使用eval
可能是一个坏主意。我只是在这里作为一个选项提出。 eval
可能会带来很大的安全风险,因为您为用户输入提供了Python解释器的全部功能。此外,它违反了编程的基本原则之一,该原则指出可执行代码的 所有 应直接映射到源代码。使用eval
评估用户输入会导致可执行代码明显不在您的源代码中。
最好使用ast.literal_eval()
,Padraic Cunningham's answer解决如何有效使用它的问题。
答案 4 :(得分:-1)
使用正则表达式:
new_list = [[int(j) for j in re.findall(r'\d+', i)] for i in old_list]