python字典值基于条件进入元组

时间:2017-07-22 20:39:51

标签: python

我试图从下面的dict获得一个输出作为下面提到的元组 -

  

输入:b = {'a':'1','S1':'OptionA','P1':'100','S2':'','P2':'','S3': 'OptionB', 'P3': '80'}

     

输出:[('OptionA','100'),('OptionB','80')]

我已为此编码,如下所示,但我想要一个更短的方法,任何人都可以建议 -

import re
b = {'a':'1','S1':'OptionA','P1':'100','S2':'', 'P2':'','S3':'OptionB','P3':'80'}

c =[]
for k,v in b.items():
    if k.startswith('S') and v:
        for i,j in b.items():
            if i.startswith('P') and re.search(r'\d+$', k).group() == re.search(r'\d+$', i).group():
                c.append(tuple([v,j]))

print(c)

2 个答案:

答案 0 :(得分:1)

我只是使用异常处理来忽略不适合您的模式的键:

"1.3"

拥有更少的行并不一定能改善您的代码。

答案 1 :(得分:0)

也许列表理解oneliner?

>>> b = {'a':'1','S1':'OptionA','P1':'100','S2':'', 'P2':'','S3':'OptionB','P3':'80'}
>>> [(v, b['P'+k[1:]]) for k,v in b.items() if re.match('^S\d+$',k) and v and 'P'+k[1:] in b]
[('OptionB', '80'), ('OptionA', '100')]

仅匹配S<digits>的非空值与P<digits>配对。

来自评论的案例的

更新。如果您需要将Stgy1Per1匹配,则列表推导解决方案开始失去其魅力并变得有点难以理解。如果您无法简化配对标准,for循环可能是一种更简洁的方法。

>>> b = {'a':'1','Stgy1':'OptionA','Per1':'100','Stgy2':'', 'Per2':'','Stgy3':'OptionB','Per3':'80'}
>>> [(v, w) for s,v in b.items() for p,w in b.items() if s[0]=='S' and p[0]=='P' and v and w and re.search('\d+$',s).group()==re.search('\d+$',p).group()]
[('OptionB', '80'), ('OptionA', '100')]