如何使用python的any()或next()函数来检查构造是否存在元素

问题描述 投票:0回答:1

我有以下要求,我想检查模式是否为任何列表项的子字符串。如果没有,请继续执行以下操作:

for(feature in features):
    permissions = ['assets:analyticdn', 'assets.analyticun', 'assets1', 'assets2']
    present = False
    for(permission in permissions):
        if('assets:analytic' in permission):
           present = True
           break

    if present == False:
        continue # go to line ---> for(feature in features):

    # execute the rest of the code if present is True

可以用更Python化的方式来缩短和编写它吗?

python python-3.x list-comprehension next any
1个回答
0
投票

首先,您不需要在for参数或if条件周围加括号。

第二,您应该交换循环,因为permissions不依赖于feature:您将进行len(features)次相同的测试,但只需要进行一次此测试。

第三,您遇到“我想继续外循环”的问题。在某些语言中,可以放置标签(continue label),但是对于此问题有一个明显的解决方案:创建一个函数。

permissions = ['assets:analyticdn', 'assets.analyticun', 'assets1', 'assets2']
features = ["feature"]

def contains_analytic(permissions):
    for permission in permissions:
        if 'assets:analytic' in permission:
            return True

    return False

for feature in features:
    if not contains_analytic(permissions):
        continue

    # execute the rest of the code if present is True

第四,您可能现在想找到permission

def find_analytic(permissions):
    for permission in permissions:
        if 'assets:analytic' in permission:
            return permission

    return None

for feature in features:
    permission = find_analytic(permissions)
    if permission is None:
        continue

    # execute the rest of the code if present is True
    print(feature, permission)

现在您可以使用next和生成器:

def find_analytic(permissions):
    return next((p for p in permissions if 'assets:analytic' in p), None)

for feature in features:
    permission = find_analytic(permissions)
    if permission is None:
        continue

    # execute the rest of the code if present is True
    print(feature, permission)

我将保留一行功能,因为它解释了what的作用:您不必问自己这行的含义或添加注释。

如果不需要permission的值,则可以使用@John Gordon在注释中建议的any('assets:analytic' in p for p in permissions)

© www.soinside.com 2019 - 2024. All rights reserved.