python - true - ¿Cómo verificar si todos los elementos de una lista coinciden con una condición?
python while true (5)
La mejor respuesta aquí es usar all()
, que es el built-in para esta situación. Combinamos esto con una expresión de generador para producir el resultado que desea de manera limpia y eficiente. Por ejemplo:
>>> 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
Y, para su ejemplo de filtro, una lista de comprensión:
>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]
Si desea verificar que al menos un elemento es 0, la mejor opción es usar any()
que sea más legible:
>>> any(item[2] == 0 for item in items)
True
Tengo una lista que consiste en 20000 listas similares. Yo uso el tercer elemento de cada lista como una bandera. Quiero hacer algunas operaciones en esta lista, siempre y cuando al menos el indicador de un elemento sea 0, es como:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
Al principio todos los indicadores son 0. Utilizo un ciclo while para verificar si al menos el indicador de un elemento es 0:
def check(lista):
for item in lista:
if item[2] == 0:
return True
return False
Si check(my_list)
devuelve True
, entonces sigo trabajando en mi lista:
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
En realidad, quería eliminar el elemento en my_list mientras lo iteraba, pero no puedo eliminar el elemento mientras lo repito.
Mi lista original no tenía banderas:
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
Como no pude eliminar los elementos mientras iteraba sobre ellos, inventé estas banderas. Pero my_list
contiene muchos elementos, y while
loop los lee a todos en cada ciclo for
, ¡y consume mucho tiempo! ¿Tienes alguna sugerencia?
Otra forma de usar itertools.ifilter
. Esto verifica la veracidad y el proceso (usando lambda
)
Muestra-
for x in itertools.ifilter(lambda x: x[2] == 0, my_list):
print x
Puede usar las tareas de itertools de este modo, se detendrá una vez que se cumpla una condición que falle su declaración. El método opuesto sería dropwhile
for x in itertools.takewhile(lambda x: x[2] == 0, list)
print x
Si desea verificar si algún elemento en la lista viola una condición, use 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)
Para eliminar todos los elementos que no coinciden, use el filter
# Will remove all elements where x[2] is 0
listb = filter(lambda x: x[2] != 0, listb)
de esta manera es un poco más flexible que usar 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