Python将包含列表元组的字符串解包到变量

Posted

技术标签:

【中文标题】Python将包含列表元组的字符串解包到变量【英文标题】:Python Unpack String containing Tuple of List to variables 【发布时间】:2019-12-21 15:07:25 【问题描述】:

大家好,我一直在苦苦思索如何将字符串解包到变量中,这是一个带有列表和浮点数的元组。

model_parameters="('[None, False, None, 12, False, True]', 18.837459797657008)"

但我需要的输出必须是这种形式

output=[None, False, None, 12, False, True]
error=18.837459797657008
a,b,c,d,e,f=output

这是用于加载 statsmodels.tsa.holtwinters.ExponentialSmoothing 使用来自https://machinelearningmastery.com/how-to-grid-search-triple-exponential-smoothing-for-time-series-forecasting-in-python/的网格搜索模型

【问题讨论】:

与之前的评论类似。没有办法直接访问这些值吗?如果它不可用,它应该是一个错误。 【参考方案1】:

你可以使用ast.literal_eval两次:

import ast

model_parameters="('[None, False, None, 12, False, True]', 18.837459797657008)"

list_as_str, error = ast.literal_eval(model_parameters)
output = ast.literal_eval(list_as_str)
a,b,c,d,e,f = output

# We have all the values we want:
print(a, b, c, d, e, f, error)
# None False None 12 False True 18.837459797657008

【讨论】:

【参考方案2】:

你可以这样做:

import ast

def parse_tuple(string):
    try:
        s = ast.literal_eval(str(string))
        if type(s) == tuple:
            return s
        return
    except:
        return
t="('[None, False, None, 12, False, True]', 18.837459797657008)"
a=parse_tuple(t)
a=eval('[' + a[0] + ']')[0]

首先,我们定义一个函数来将你的字符串转换为元组, 在a=parse_tuple(t) 之后,a[1] 将是18.837459797657008, 然后我们将其他元素转换为列表,您可以使用a[i]分别访问值。

【讨论】:

【参考方案3】:

这对使用 Python eval 最简单。表达式参数被解析并评估为 Python 表达式的位置

看这里:

model_parameters = "('[None, False, None, 12, False, True]', 18.837459797657008)"

m = eval(model_parameters)
output = eval(m[0])
error = m[1]
a, b, c, d, e, f = output

print(error)
print(a,b,c,d,e,f)

输出:

18.837459797657008
None False None 12 False True

【讨论】:

以上是关于Python将包含列表元组的字符串解包到变量的主要内容,如果未能解决你的问题,请参考以下文章

字典 元组

python中的解包

在python中将值解包到多个变量中

测试变量是列表还是元组

Python入门教程第58篇 函数进阶之元组解包

python列表和元组的方法和属性