我有一个包含 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,那么我将继续处理我的列表:
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消耗大量时间!你有什么建议吗?
my_list
while
for
这里最好的答案是使用all(),这是这种情况的内置函数。我们将其与生成器表达式相结合,以干净有效地产生您想要的结果。例如:
all()
>>> 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),在这种情况下阅读起来会更好一些。
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()
>>> any(flag == 0 for (_, _, flag) in items) True