如何提高这个列表的理解能力

时间:2014-09-15 13:16:35

标签: python performance list list-comprehension

我需要评估以下列表理解:

[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]

1 个答案:

答案 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将停止迭代生成器。