I have a list consisting of like 20000 lists. I use each list's 3rd element as a flag. I want to do some operations on this list as long as at least one element's flag is 0, it's like:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
In the beginning, all flags are 0. I use a while loop to check if at least one element's flag is 0:
def check(list_):
for item in list_:
if item[2] == 0:
return True
return False
If check(my_list)
returns True
, then I continue working on my list:
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
Actually, I wanted to remove an element in my_list as I iterated over it, but I'm not allowed to remove items as I iterate over it.
Original my_list didn't have flags:
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
Since I couldn't remove elements as I iterated over it, I invented these flags. But the my_list
contains many items, and while
loop reads all of them at each for
loop, and it consumes lots of time! Do you have any suggestions?
this way is a bit more flexible than using
all()
:or more succinctly:
The best answer here is to use
all()
, which is the builtin for this situation. We combine this with a generator expression to produce the result you want cleanly and efficiently. For example:And, for his filter example, a list comprehension:
If you want to check at least one element is 0, the better option is to use
any()
which is more readable:Another way to use
itertools.ifilter
. This checks truthiness and process (usinglambda
)Sample-
You could use itertools's takewhile like this, it will stop once a condition is met that fails your statement. The opposite method would be dropwhile
If you want to check if any item in the list violates a condition use
all
:To remove all elements not matching, use
filter