Python:从 1.0 的奇怪列表中获取元素?

Python: getting elements out of strange list that are 1.0?

所以我正在使用 Gurobi 优化器,我的决策变量在一个名为 decision_bi 的列表中,看起来像这样:

<gurobi.Var dc0_st0_1/0 (value 0.0)>

我已经设法将这些筛选为变量名称包含“_1/0”的变量(我认为):

matching = filter(lambda x: '_1/0' in x, decision_bi)

但是现在,我只需要提取此匹配列表中具有(值 1.0)的那些,如下所示:

<gurobi.Var dc5_st1099_1/0 (value 1.0)>

我已经设法将它放入一个平面列表中(我遇到了问题,它只能由 decision_bi[i][j].X 和 .VarName 访问,它们不合作),并且我使用以下代码尝试使用正则表达式过滤 1.0 数字:

import re

flat_list=[]
for sublist in matching:
    for item in sublist:
        flat_list.append(item)

results=[]
for i in len(flat_list):
    results[i] = re.search('.*?1\.0', flat_list[i], flags=0)

但是,它告诉我该列表不可迭代...我不知道为什么?在 flat_list returns 列表上使用类型。 我的最终目标是编写两个不同的列表,其中包含中间字符串的 dc 和 st 部分之后的数字,如果重要的话。

您可以在单个正则表达式中同时应用“1/0”和 "value 1.0" 检查:

In [1]: import re

In [2]: pattern = re.compile(r"<gurobi\.Var .*?_1/0 \(value 1\.0\)>")

In [3]: pattern.match("<gurobi.Var dc0_st0_1/0 (value 0.0)>")

In [4]: pattern.match("<gurobi.Var dc5_st1099_1/0 (value 1.0)>")
Out[4]: <_sre.SRE_Match object; span=(0, 39), match='<gurobi.Var dc5_st1099_1/0 (value 1.0)>'>

请注意,我们需要对文字点和左括号和右括号进行 bask-slash-escape,因为它们在正则表达式语法中具有特殊含义。

如果您有这样的变量列表,您可以使用列表推导将它们过滤掉:

In [5]: values = [
    ...:     "<gurobi.Var dc0_st0_1/0 (value 0.0)>",
    ...:     "<gurobi.Var dc5_st1099_1/0 (value 1.0)>",
    ...:     "<gurobi.Var dc5_st1099_2/0 (value 2.0)>"
    ...: ]
In [6]: [value for value in values if pattern.match(value)]
Out[6]: ['<gurobi.Var dc5_st1099_1/0 (value 1.0)>']

你不应该使用字符串表示。相反,根据 VarName and X attributes of the Var 对象创建列表,例如:

myVars = [v for v in model.getVars() if v.X == 1.0 and '_1/0' in v.VarName]