将包含空格而不是逗号的字符串列表转换为列表嵌套列表

3
我有以下字符串:
'[[ 0.03694573  0.01084746  0.01306414  0.00499198  0.00307188]\r\n [ 0.03780498  0.02610241  0.00967986  0.02228694 -0.01153102]\r\n [ 0.03837708  0.02111896  0.01370878 -0.00136839  0.01906253]\r\n [ 0.03490672 -0.02791057  0.08824896 -0.01991765  0.01964361]\r\n [ 0.0811892   0.28361901  0.21539196 -0.00259571  0.28737829]\r\n [ 0.20022041  0.16184418  0.25939959  0.00546446  0.36415219]\r\n [ 0.22920615  0.27439767  0.36991198  0.00624375  0.39911759]]'

如您所见,它由列表的列表组成。但是,列表内的每个元素都用制表符而不是逗号分隔,因此ast.literal_eval()无法使用。有人有什么好的想法将其转换为列表的列表吗?

.split 怎么样? - Ma0
为什么你要用那种格式呢?如果你是从文件中读取的,难道不能将数字存储在一个二维网格中吗? - sshashank124
先用逗号替换制表符:s.replace("\t", ",") - Mateen Ulhaq
这些数字是从SciKit Learn存储的原始排列重要性指数。我会尝试改变它们的保存方式,但现在我只是想知道如何解决这个问题。 - BillyJo_rambler
3个回答

2

以下是使用re.sub的一种方法:

import re
literal_eval(','.join(re.sub(r'(?<=\d)(\s+)(?=-?\d)', ',', s).splitlines()))

[[0.03694573, 0.01084746, 0.01306414, 0.00499198, 0.00307188],
 [0.03780498, 0.02610241, 0.00967986, 0.02228694, -0.01153102],
 [0.03837708, 0.02111896, 0.01370878, -0.00136839, 0.01906253],
 [0.03490672, -0.02791057, 0.08824896, -0.01991765, 0.01964361],
 [0.0811892, 0.28361901, 0.21539196, -0.00259571, 0.28737829],
 [0.20022041, 0.16184418, 0.25939959, 0.00546446, 0.36415219],
 [0.22920615, 0.27439767, 0.36991198, 0.00624375, 0.39911759]]

1
那很好用。现在我只需要解码所有正则表达式的含义。 - BillyJo_rambler
意思是:将每个由数字前导且不跟随“-”或数字的空格块替换为一个“,”。 - Matthias

1

将字符串修改直到可以被literal_eval解释。基本上这意味着在需要的地方添加","。

如果您的字符串称为data

import ast
data = data.replace('  ', ',').replace('\r\n ', ',')
result = ast.literal_eval(dat2)

现在,result将包含您的列表。
我不确定你是否有空格或制表符。 如果您有制表符,则必须将' '替换为'\t\t'

ast.literal_eval被冠以危险之名。 - amirouche
2
@amirouche 你是否混淆了 evalliteral_eval?请阅读 https://dev59.com/3G445IYBdhLWcg3wws0u。 - Matthias
抱歉打扰了! - amirouche

0

这只是一个大致的想法。可以变得更小。

input = '[[ 0.03694573  0.01084746  0.01306414  0.00499198  0.00307188]\r\n [ 0.03780498  0.02610241  0.00967986  0.02228694 -0.01153102]\r\n [ 0.03837708  0.02111896  0.01370878 -0.00136839  0.01906253]\r\n [ 0.03490672 -0.02791057  0.08824896 -0.01991765  0.01964361]\r\n [ 0.0811892   0.28361901  0.21539196 -0.00259571  0.28737829]\r\n [ 0.20022041  0.16184418  0.25939959  0.00546446  0.36415219]\r\n [ 0.22920615  0.27439767  0.36991198  0.00624375  0.39911759]]'

input = input.replace('\r\n', ',')

array_of_arrays = input.split(',')
array_of_strings = []
for arr in array_of_arrays:
     _arr = arr.replace('[', '')
     _arr = _arr.replace(']', '')
     array_of_strings.append(_arr)
result = []
for arr in array_of_strings:
     num_strings = arr.split()
     num_arr = [float(x) for x in num_strings]
     result.append(num_arr)

print(result) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接