我在使用Dict和list理解作为案例陈述时遇到了麻烦。我只想要第一场比赛-但我得到了所有比赛。字典相当长,但看起来像这样:
categories = { 'rhsa' : 'Red Hat',
'red hat' : 'Red Hat',
'.net' : 'Microsoft .Net',
'sql server' : 'MS SQL',
'microsoft' : 'Microsoft',
etc..}
功能很简单:
def vuln_category(vuln_title):
vuln_cat = ''
vuln_title = vuln_title.lower()
try:
vuln_cat = ''.join([categories[k] for k in categories if (k in vuln_title and len(vuln_cat)==0)]) # ''.join() to convert to string
if vuln_cat == '':
vuln_cat = 'Other'
except KeyError:
vuln_cat = 'Other'
return vuln_cat
我得到的是“第三方软件VMWareMicrosoftVMWare”。显然,“和len(vuln_cat)== 0”并没有像我期望的那样在循环中求值,导致每个类别匹配将dict值连接在一起。
是的,我可以(并且已经)将其编码为嵌套循环,这是一个简单的解决方法,但是我想知道解决此问题的正确方法。
Python版本是3.4。我试图保持这个简单,因为它是一个笨拙的脚本。
vuln_cat
仅在列表理解完成后才设置,您无法从内部理解访问正在构建的列表。
而是在函数内部使用生成器表达式,这只会选择第一个匹配结果:next()
def vuln_category(vuln_title):
vuln_title = vuln_title.lower()
return next(
(categories[k] for k in categories if k in vuln_title),
'Other')
该next()
函数的第二个参数是默认值,如果生成器表达式未产生任何结果,则使用该默认值。
演示:
>>> categories = {
... 'rhsa': 'Red Hat',
... 'red hat': 'Red Hat',
... '.net': 'Microsoft .Net',
... 'sql server': 'MS SQL',
... 'microsoft': 'Microsoft',
... }
>>> def vuln_category(vuln_title):
... vuln_title = vuln_title.lower()
... return next(
... (categories[k] for k in categories if k in vuln_title),
... 'Other')
...
>>> vuln_category('Microsoft SQL Server on .NET')
'MS SQL'
>>> vuln_category('Red Hat RHSA')
'Red Hat'
>>> vuln_category('Mac OS X')
'Other'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句