我试图从下面的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)
答案 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>
配对。
更新。如果您需要将Stgy1
与Per1
匹配,则列表推导解决方案开始失去其魅力并变得有点难以理解。如果您无法简化配对标准,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')]