Python 将数字列表的字符串转换为实际的数字列表列表

Python transform a string of a list of numerical lists into an actual list of numerical lists

提问人:sarahParker 提问时间:3/28/2022 最后编辑:S3DEVsarahParker 更新时间:3/28/2022 访问量:61

问:

我知道有类似的帖子与这个主题有关,但是它们通常侧重于列表项是字母,因此结果通常意味着它们被双引号括起来。

但是,我正在处理数字列表,我无法找到解决方案来满足我转换数字列表列表的字符串表示的需要......

"[1,2,3,4,5,6],[5,1,4,6,3,2],[3,6,4,1,5,2]"

...变成数值 s 的实际数值,正如我所提到的,我正在处理数学的数值项。listlist

list_string = "[1,2,3,4,5,6],[5,1,4,6,3,2],[3,6,4,1,5,2]"
ini_list = "[" + list_string + "]"

goal = list(ini_list)
print(goal)

#Desired Outcome:    
#goal = [[1,2,3,4,5,6],[5,1,4,6,3,2],[3,6,4,1,5,2]]
python 字符串 列表 类型转换 嵌套列表

评论

0赞 S3DEV 3/28/2022
你试过吗,从图书馆?ast.liter_evalast

答:

0赞 Urh 3/28/2022 #1

您可以使用执行 python 代码的函数。exec()

>>> exec("a = [[1,2,3,4,5,6],[5,1,4,6,3,2],[3,6,4,1,5,2]]")
>>> a
[[1, 2, 3, 4, 5, 6], [5, 1, 4, 6, 3, 2], [3, 6, 4, 1, 5, 2]]
0赞 S3DEV 3/28/2022 #2

一个非常简单(且安全/可靠)的方法是使用该功能。ast.literal_evel

在这种情况下,该函数是评估字符串并将其转换为预期类型的安全方法,因为函数中有逻辑有助于消除评估恶意代码的风险。ast.literal_eval

用:

import ast

list_string = "[1,2,3,4,5,6],[5,1,4,6,3,2],[3,6,4,1,5,2]"
result = ast.literal_eval(f'[{list_string}]')

输出:

 [[1, 2, 3, 4, 5, 6], [5, 1, 4, 6, 3, 2], [3, 6, 4, 1, 5, 2]]    
0赞 Cubix48 3/28/2022 #3

这里有一种使用列表推导和更快的方法:split()

list_string = "[1,2,3,4,5,6],[5,1,4,6,3,2],[3,6,4,1,5,2]"

goal = [[int(num) for num in sublist.split(",")] for sublist in list_string[1:-1].split("],[")]
print(goal)  # [[1, 2, 3, 4, 5, 6], [5, 1, 4, 6, 3, 2], [3, 6, 4, 1, 5, 2]]

  • 我们在每个 中分离字符串,以检索不同的子列表。],[
  • 然后,我们将每个子列表分开,最后将分开的数字转换为整数。,

for 循环的替代方案是:

goal = []
for sublist in list_string[1:-1].split("],["):
    new_sublist = []
    for num in sublist.split(","):
        new_sublist.append(int(num))
    goal.append(new_sublist)
print(goal)
0赞 Усердный бобёр 3/28/2022 #4

如果你采用 list(string),你只会将字符串拆分为字符。例如 = .list('[1, 2]')['[', '1', ',', ' ', '2', ']']

但是你所拥有的是一个包含 python 文本(描述值的一段代码)的字符串。你需要把它变成实际价值。为此,有功能。所以就去做吧.希望我能帮到你。evalgoal = eval(ini_list)

评论

0赞 S3DEV 3/28/2022
在推荐该功能之前,请仔细阅读此问题彻底理解它。eval
0赞 Усердный бобёр 3/28/2022
@S3DEV ,如果您正确地知道字符串包含的内容,那么使用 eval 也没有什么不好的。至少它比.split
0赞 Cubix48 3/28/2022
@Усердныйбобёр 我相信你会发现一个有趣的事实,即使用实际上比使用快得多(使用 ,20.476404585002456 秒和 2.5082522810043884 秒)。split()eval()timeiteval()split()
0赞 Kelly Bundy 3/28/2022
@Cubix48 你得到什么时间?ast.literal_evaljson.loads
0赞 Усердный бобёр 3/28/2022
@Cubix48,我认为速度不是主要需要担心的事情。如果你想要高速 - 可能你是对的。要获得高速,更好的办法是使用包。但是你没有想过错误吗?例如,如果多一个或少一个空间怎么办?它会坏的!numba