我需要评估以下列表理解:
[r for r in listOfList if
1 not in [lst[i] for i in r] and
0 in [lst[i] for i in r]
]
也就是说,我需要得到一个列表(数字)列表,其中每个列表都没有等于1的元素,但至少有一个元素等于0。
正如您所看到的那样,重复了[lst[i] for i in r]
有没有办法改进我的列表理解的评估?
示例:
listOfList = [[0, 1, 2], [3, 4, 5], [6, 7, 8],
[0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]]
lst = [0, 1, None, None, None, 1, None, None, 0]
答案 0 :(得分:2)
您可以使用嵌套循环首先从lst
计算子集,或您可以使用any()
function来使用生成器表达式并限制数量迭代:
使用嵌套列表循环:
[r for r in listOfList
for indexed in ({lst[i] for i in r},)
if 1 not in indexed and 0 in indexed]
我还将子集从lst
更改为一组,以便使用更快的恒定时间成员资格测试。
使用any()
:
[r for r in listOfList
if not any(lst[i] == 1 for i in r) and
any(lst[i] == 0 for i in r)]
在遇到计算结果为any()
的表达式时, True
将停止迭代生成器。