首页 > 解决方案 > 如何使用 python 的 any() 或 next() 函数检查构造以查看元素是否存在

问题描述

我有以下要求,我想检查一个模式是否是任何列表项的子字符串。如果没有,则继续如下:

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

这可以缩短并以更pythonic的方式编写吗?

标签: pythonpython-3.xlist-comprehensionnextany

解决方案


首先,您不需要在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)

我会保留单行功能,因为它解释它的作用:您不必问自己这一行是什么意思或添加评论。

如果您不需要 的值permission,那么您可以any('assets:analytic' in p for p in permissions)按照@John Gordon 在评论中的建议使用。


推荐阅读