您的arr 是一个只有一个元素的列表:一个字符串。使用eval() 解析这似乎是一个不错的选择,但要安全地解析它,您应该使用ast.literal_eval。
现在,如果我们这样做:
from ast import literal_eval
arr = ["(2,2),(2,2),(2,2),(2,2)"]
evaluated = literal_eval(arr)
print(evaluated)
...我们得到一个错误:
ValueError: malformed node or string: ['(2,2),(2,2),(2,2),(2,2)']
arr 不是字符串,但将arr 转换为字符串并将其传递给literal_eval 可以,但它什么也没做,只是返回相同的arr
我们需要做的是将arr 的第一个(并且仅在这种情况下)元素转换为元组列表,而不是当前的字符串。
所以我们将arr[0] 传递给literal_eval,它会返回:
from ast import literal_eval
arr = ["(2,2),(2,2),(2,2),(2,2)"]
evaluated = literal_eval(arr[0])
print(evaluated)
((2, 2), (2, 2), (2, 2), (2, 2))
一个tuple 的元组。我们越来越近了。要将元组转换为字符串,我们只需这样做:
list(tuple)
我们的元组列表存储在变量evaluated 中,因此要将其转换为列表,我们这样做:
list(evaluated)
...返回这个:
[(2, 2), (2, 2), (2, 2), (2, 2)]
更近了。要将evaluated 中的元组转换为列表,我们可以使用列表推导:
outputrequired = [list(t) for t in evaluated]
这基本上翻译为:
outputrequired = []
for t in evaluated:
outputrequired.append(list(t))
这只是一种更有效的方式。
无论如何,这是outputrequired 的结果:
[[2, 2], [2, 2], [2, 2], [2, 2]]
列表列表。
完整代码:
from ast import literal_eval
arr = ["(2,2),(2,2),(2,2),(2,2)"]
evaluated = literal_eval(arr[0])
evaluated = list(evaluated)
outputrequired = [list(t) for t in evaluated]
print(outputrequired)
Run and edit this code online