我有以下要求,我想检查模式是否为任何列表项的子字符串。如果没有,请继续执行以下操作:
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化的方式来缩短和编写它吗?
首先,您不需要在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)
。