我有一个包含大约 20000 个列表的列表。我使用每个列表的第三个元素作为标志。我想对这个列表做一些操作,只要至少有一个元素的标志为0,就像:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
一开始,所有标志都是0。我使用while循环来检查是否至少一个元素的标志是0:
def check(list_):
for item in list_:
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()
,这是针对这种情况的内置函数。我们将其与 generator expression干净有效地产生您想要的结果。例如:
>>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
True
>>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
False
注意 all(flag == 0 for (_, _, flag) in items)
直接等价于 all(item[2] == 0 for item in items)
,在这种情况下阅读起来会更好一些。
并且,对于过滤器示例,列表推导(当然,您可以在适当的情况下使用生成器表达式):
>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]
如果要检查至少一个元素为 0,更好的选择是使用 any()
哪个更具可读性:
>>> any(flag == 0 for (_, _, flag) in items)
True
关于python - 如何检查列表的所有元素是否符合条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666163/