所以我使用了Gurobi优化器,我的决策变量位于名为decision_bi的列表中,如下所示:
<gurobi.Var dc0_st0_1/0 (value 0.0)>
我已设法将这些内容过滤到变量名称包含&#39; _1 / 0&#39;以下(我认为):
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来访问,而且没有合作),我正在尝试使用regex进行过滤使用以下代码的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上使用type返回一个列表。 我的最终目标是编写两个不同的列表,其中包含数据库中间字符串的dc和st部分之后的数字,如果重要的话。
答案 0 :(得分:1)
您可以同时应用&#34; 1/0&#34;和&#34;值1.0&#34;检查单个正则表达式:
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)>']
答案 1 :(得分:0)