【问题标题】:How to check using python's any() or next() functions the construct to see if element is present or not如何使用 python 的 any() 或 next() 函数检查构造以查看元素是否存在
【发布时间】:2020-06-10 18:49:31
【问题描述】:

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

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 的方式编写吗?

【问题讨论】:

  • 同样,这段代码应该做什么?实际上,您正在检查'assets:analytic' 是否是permissions 中任何项目的子字符串,这始终是正确的,因为permissions 中的第一项是'assets:analyticdn',其中包含'assets:analytic'...
  • 如果你想问“'assets:analytic'是权限列表中任何项目的子字符串吗?”,你可以这样:if any('assets:analytic' in p for p in permissions):

标签: python python-3.x list-comprehension next any


【解决方案1】:

首先,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 的值,那么您可以按照@John Gordon 在评论中的建议使用any('assets:analytic' in p for p in permissions)

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 2018-01-31
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2021-05-17
    • 1970-01-01
    • 2016-08-05
    相关资源
    最近更新 更多