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

时间:2015-04-13 16:21:53

标签: python string list int

我有一个字符串列表,这些字符串是列表。像这样:['[1,2,3]','[10,12,5]'],例如。我想得到一份清单,甚至是每个清单:

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

5 个答案:

答案 0 :(得分:2)

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

您使用ast.literal_eval

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]