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

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

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

在开始时,所有的标志都是0.我使用while循环来检查是否至less有一个元素的标志是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循环中读取它们,并且会占用大量时间! 你有什么build议吗?

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

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

而且,对于他的filter例子,列表理解:

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

如果你想检查至less有一个元素是0,最好的select是使用更可读性的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) 

这种方式比使用all()更灵活:

 my_list = [[1, 2, 0], [1, 2, 0], [1, 2, 0]] all_zeros = False if False in [x[2] == 0 for x in my_list] else True any_zeros = True if True in [x[2] == 0 for x in my_list] else False 

另一种使用itertools.ifilter 。 这检查真实性和过程(使用lambda

样品-

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