比较两个集合列表

2024-09-28 03:13:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我的第一组列表:

set1 = [
    {'read', 'execute', 'helloworld.exe'}, 
     {'read', 'pinglog', 'write'}, 
     {'read', 'nya'}, 
     {'read', 'execute', 'write', 'goodluck'}
]

现在我看看下面这些不同的集合是否在集合的第一个列表中

final = [
    {'read', 'nya'}, 
    {'helloworld.exe', 'write'},
    {'execute', 'nya'}, 
    {'read', 'pinglog'}, 
    {'write', 'pinglog'}
]

预期结果是

OK
Access denied
Access denied
OK
OK
OK

这是我的代码,我知道的不多,但我的头已经痛了,因为我已经试着这样做了两天:

for j in range(len(final)):
    for i in range(len(set1)):
        if final[j] == set1[i]:
            print("OK")

    print("Access denied")

Tags: in列表forreadexecuteaccessokexe
2条回答

您似乎正在测试您的集合是否是子集;可以使用^{} operator on the sets执行此操作:

>>> final[0], set1[2]  # same
({'nya', 'read'}, {'nya', 'read'})
>>> final[0] <= set1[2]
True
>>> final[3], set1[1]  # subset
({'pinglog', 'read'}, {'write', 'pinglog', 'read'})
>>> final[3] <= set1[1]
True
>>> final[4], set1[1]  # subset
({'write', 'pinglog'}, {'write', 'pinglog', 'read'})
>>> final[4] <= set1[1]
True

使用^{} functiongenerator expressionset1中的所有集合测试给定集合:

for request in final:    
    if any(request <= s for s in set1):
        print("OK")
    else:
        print("Access denied")

演示:

>>> for request in final:
...     if any(request <= s for s in set1):
...         print("OK")
...     else:
...         print("Access denied")
...
OK
Access denied
Access denied
OK
OK

我们可以使用一个生成器表达式来检查任意x是否是set1中任意集合的子集,如果是,我们打印OK否则Access Denied

for i in ('OK' if any(x <= y for y in set1) else 'Access Denied' for x in final):
    print(i)
OK
Access Denied
Access Denied
OK
OK

相关问题 更多 >

    热门问题