将Python中数组的字符串表示转换为实际数组

3

你好,我正在进行一些网络相关的工作,想知道是否有将Python数组作为字符串转换回Python数组的方法..例如:

x = "[1,2,3,4]"

将x转换成

x_array = [1,2,3,4]

如果能够适用于NumPy多维数组,将是额外的奖励!

5个回答

8

对于普通数组,请使用ast.literal_eval

>>> from ast import literal_eval
>>> x = "[1,2,3,4]"
>>> literal_eval(x)
[1, 2, 3, 4]
>>> type(literal_eval(x))
<type 'list'>
>>>

numpy.array 有点棘手,因为 Python 将其呈现为字符串:

>>> import numpy as np
>>> x = [[1,2,3], [4,5,6]]
>>> x = np.array(x)
>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> x = str(x)
>>> x
'[[1 2 3]\n [4 5 6]]'
>>>

然而,对于简单的情况,您可以使用替换空格为逗号的方法,使用re.sub

>>> import re
>>> x = re.sub("\s+", ",", x)
>>> x
'[[1,2,3],[4,5,6]]'
>>>

然后,你可以使用ast.literal_eval将其转换回numpy.array

>>> x = literal_eval(x)
>>> np.array(x)
array([[1, 2, 3],
       [4, 5, 6]])
>>>

3
Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 
>>> import json
>>> json.loads("[1,2,3,4]")
[1, 2, 3, 4]
>>> 

1
你为什么既回答问题又标记为重复? - njzk2
请阅读此链接:http://meta.stackexchange.com/questions/4283/closing-etiquette-why-do-some-answer-and-close。 - njzk2
此外,这个答案已经在重复的帖子中提到了。 - njzk2
@njzk2 哦,我没有看到其他答案提到 JSON 的部分。 - rlms
1
@njzk2,你应该阅读链接问题的答案:)“本问题应该关闭(稍后删除),但首先给提问者他们正在寻找的答案,这样我们就不会让他们因此有一个非常糟糕的体验。” - warvariuc

1
如果你确定字符串的结构总是这样的,你可以去掉括号并分割字符串:
x_array = [int(y) for y in x[1:-1].split(',') if y.strip()]

akaRem??这是列表的无效语法。没人在意。字符串应该包含有效的列表表示。 - José Tomás Tocino
x = "[1, 2, 3, 4, 5, ]" 处发生了中断。 - rlms
使用strip函数来检查空字符串,问题已经解决。 - José Tomás Tocino

1

试试这个:

x_array = [(int(y) if y.strip() else None) for y in x[1:-1].split(',')]

+1 不过,虽然我明白你的意图,但我认为你应该在这里包含一个 list(filter(lamda x: x is not None, 来剔除 None 值。 - rlms

1
我建议您不要这样做。这种方法很难扩展到通过网络发送自己定义的类实例等情况。相反,我建议您使用picklejson之类的工具将数据转换为字节,通过网络发送后再将其转换回来。然而,在其他情况下,我通常会使用ast.literal_eval。如果您能说明如何通过网络发送数据,我可以给您提供pickle在您的情况下的示例用法。

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