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