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]
所以我正在使用 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]