簡體   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