python - operaciones - Cada elemento de la lista es verdadero booleano.
valores booleanos y operaciones logicas (4)
Asumiendo que la función de comparación devuelve un valor booleano, y sabiendo que Verdadero / Falso se convierte en 1/0 en un contexto entero, puede hacer:
values = new_subjects.values()
sum(compare(v) for v in values) == len(values) -1
Yo sé eso
all(map(compare,new_subjects.values()))==True
Me diría si cada elemento de la lista es verdadero. Sin embargo, ¿cómo puedo saber si todos los elementos, excepto uno de ellos, son verdaderos?
Cuenta cuántos no son verdaderos:
values = (compare(val) for val in new_subjects.itervalues())
if sum(1 for x in values if not x) == 1: # just one
...
Si quiere decir que es realmente True
y no se evalúa como verdadero, ¿puede simplemente contarlos?
>>> L1 = [True]*5
>>> L1
[True, True, True, True, True]
>>> L2 = [True]*5 + [False]*2
>>> L2
[True, True, True, True, True, False, False]
>>> L1.count(False)
0
>>> L2.count(False)
2
>>>
comprobando solo un falso:
>>> def there_can_be_only_one(L):
... return L.count(False) == 1
...
>>> there_can_be_only_one(L1)
False
>>> there_can_be_only_one(L2)
False
>>> L3 = [ True, True, False ]
>>> there_can_be_only_one(L3)
True
>>>
Edición: En realidad esta responde mejor a tu pregunta:
>>> def there_must_be_only_one(L):
... return L.count(True) == len(L)-1
...
>>> there_must_be_only_one(L3)
True
>>> there_must_be_only_one(L2)
False
>>> there_must_be_only_one(L1)
False
values = map(compare, new_subjects.values())
len([x for x in values if x]) == len(values) - 1
Básicamente, filtra la lista en busca de valores verdaderos y compara la longitud de esa lista con la original para ver si es uno menos.