如何检查列表中的所有元素是否与条件匹配?

我有一个包含20000个列表的列表。 我使用每个列表的第三个元素作为标志。 只要至少有一个元素的标志是0,我想在这个列表上做一些操作,就像:

my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]

在开始时,所有标志都是0.我使用while循环来检查至少一个元素的标志是否为0:

def check(lista):
    for item in lista:
        if item[2] == 0:
            return True
    return False

如果check(my_list)返回True ,那么我继续处理我的列表:

while check(my_list):
    for item in my_list:
        if condition:
            item[2] = 1
        else:
            do_sth()

实际上,我想在my_list中移除元素,但是我在迭代它时不允许删除项目。

原始my_list没有标志:

my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]

由于我无法删除元素,因为我重复了它,所以我发明了这些标志。 但my_list包含很多项目, while循环会在每个for循环中读取它们,并且它会消耗大量时间! 你有什么建议吗?


这里最好的答案是使用all() ,这是内置的这种情况。 我们将这与一个生成器表达式结合起来,以产生您想要的干净而高效的结果。 例如:

>>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
>>> all(item[2] == 0 for item in items)
True
>>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
>>> all(item[2] == 0 for item in items)
False

而且,对于他的过滤器例子,列表理解:

>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]

如果你想检查至少一个元素是0,最好的选择是使用更可读的any()

>>> any(item[2] == 0 for item in items)
True

您可以像这样使用itertools的时间,一旦满足条件而导致语句失败,它就会停止。 相反的方法将是下降

for x in itertools.takewhile(lambda x: x[2] == 0, list)
    print x

如果您想检查列表中是否有任何项目违反条件,请使用all

if all([x[2] == 0 for x in lista]):
    # Will run if all elements in the list has x[2] = 0 (use not to invert if necessary)

要删除所有不匹配的元素,请使用filter

# Will remove all elements where x[2] is 0
listb = filter(lambda x: x[2] != 0, listb)
链接地址: http://www.djcxy.com/p/70691.html

上一篇: How to check if all elements of a list matches a condition?

下一篇: Fastest way to check if a value exist in a list