擅长:python、mysql、java
<p>也许有一张单子?你知道吗</p>
<pre><code>>>> 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')]
</code></pre>
<p>只有匹配<code>S<digits></code>的非空值与<code>P<digits></code>成对。你知道吗</p>
<hr/>
<p><strong>根据评论更新案例。如果需要将<code>Stgy1</code>与<code>Per1</code>匹配,列表理解解决方案将开始失去魅力,变得有点不可读。如果不能简化配对条件,<code>for</code>循环可能是一种更干净的方法。你知道吗</p>
<pre><code>>>> 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')]
</code></pre>