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

时间:2017-12-14 02:25:03

标签: python regex gurobi

所以我使用了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部分之后的数字,如果重要的话。

2 个答案:

答案 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)

您不应该使用字符串表示。相反,请根据VarName对象的XVar属性创建列表,例如:

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