如何检查列表中的所有元素是否与条件匹配?
我有一个像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