python dict和list comprehension用作switch语句-不能按预期工作

哈维·萨默斯(Harvey Summers)

我在使用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。我试图保持这个简单,因为它是一个笨拙的脚本。

马丁·彼得斯(Martijn Pieters)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

python append 2d list不能按预期工作是一个错误?

Python计数器值和布尔all()不能按预期工作

python .format不能按预期工作

addEventListener和`this`不能按预期工作

Python的__import__不能按预期工作

python 生成器不能按我的预期工作

为什么打印语句不能按预期工作?

为什么 Lock 语句不能按预期工作

List <T> .Except(List <T>)不能按预期工作

Typescript noImplicitAny和noImplicitReturns不能按预期工作

为什么^和$不能按预期工作?

缀符号和with(...)不能按我预期的方式工作

'查找'与'-o'和'-exec chown'不能按预期工作

为什么.addClass()和.removeClass()不能按预期工作?

XPath逻辑“和”不能按预期工作?

java instanceof和getClass()不能按预期工作

实体框架6“有必要”和“有很多”部分工作-不能按预期工作

Python handlers.TimedRotatingFileHandler 旋转不能按我预期的那样工作

为什么 Python 版本的 Excel 的 Range.Resize 不能按预期工作?

Python telnetlib.expect()点字符“。” 不能按预期工作

在List.Any()内部使用EndsWith()不能按预期工作

单元测试:“ [] |>应该等于List.empty”不能按预期工作

_Generic assoc-list中的函数指针类型不能按预期工作吗?

评估全局变量和本地变量的论点不能按预期工作

pytest与REST框架交互时,PATCH和PUT不能按预期工作

为什么在Kotlin中链接.map()和.filter()不能按预期工作?

Golang:file.Seek和file.WriteAt不能按预期工作

为什么移动语义和RVO都不能按预期工作?

SwiftUI:手势和偏移不能按预期工作