繁体   English   中英

将列表字符串转换为列表中的整数列表

[英]Convert strings of list to list of integers inside a list

我有一个字符串列表,这些字符串是列表。 像这样: ['[1,2,3]','[10,12,5]'] ,例如。 我想获取列表列表,甚至那里的每个列表:

[[1,2,3],[10,12,5]]

您应该使用literal_evalstring获取实际的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

您使用ast.literal_eval

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM