2017-05-01 3 views
2

Supposons que j'ai deux listes:Python opérations booléennes sur les listes - résultats incohérents

>>> y 
[False, False, True, False, True, False, False, True, False, True, False, False] 
>>> z 
[False, True, True, True, True, True, False, False, False, False, False, True] 

Je fais ce qui suit:

>>> y or z 
[False, False, True, False, True, False, False, True, False, True, False, False] 
>>> z or y 
[False, True, True, True, True, True, False, False, False, False, False, True] 

Si pas la bonne réponse soit comme indiqué ci-dessous?

[False, True, True, True, True, True, False, True, False, True, False, True] 

Je reçois aussi des réponses incorrectes avec and:

>>> y and z 
[False, True, True, True, True, True, False, False, False, False, False, True] 
>>> z and y 
[False, False, True, False, True, False, False, True, False, True, False, False] 

I testé 1 et de 0 avec des résultats impairs:

>>> y=[0,0,0,0,0] 
>>> z=[1,1,1,1,1] 
>>> y or z 
[0, 0, 0, 0, 0] 
>>> z or y 
[1, 1, 1, 1, 1] 
>>> y and z 
[1, 1, 1, 1, 1] 
>>> z and y 
[0, 0, 0, 0, 0] 

Qu'est-ce que je fais mal?

+0

essayez d'enrouler vos listes dans un appel booléen comme 'bool ([False])' pour comprendre pourquoi cela se produit –

+0

Comme le suggèrent les réponses, 'or' ne fonctionne pas de cette façon. Cependant 'numpy.logical_or' fonctionne comme ceci, donc peut vous être utile. https://docs.scipy.org/doc/numpy/reference/generated/numpy.logical_or.html – Stuart

Répondre

1

L'approche correcte pour or opération:

[a or b for a, b in zip(y, z)] 

L'approche correcte pour and opération:

[a and b for a, b in zip(y, z)] 

None, False, 0, '',(), [], {} and few more (mentionné ici ->Truth Value Testing) sont considérés False.

est ici quelques exemples:

[] est False, [False] est True depuis son pas vide, contrôle à l'aide bool([False])

>>> [] and [False] 
[] 
>>> bool([] and [False]) 
False 

[] est False, [False] est True, donc ici True

>>> [] or [False] 
[False] 
>>> bool([] or [False]) 
True 
6

y or z ne se comporte pas comme vous le pensez, sur les éléments individuels. Au lieu de cela, il évalue la «vérité» du premier argument (y). Puisque y est une liste non vide, elle est évaluée à true. L'instruction globale est ensuite évaluée à y.

De même, z or y cherche d'abord à voir si z est véridique (ce qui est, car c'est une liste non vide). Ainsi, la déclaration évalue à z sans jamais regarder y ou les éléments en son sein.

Voici quelques exemples plus clairs:

>>> [1,2,3,4] or [5,6,7,8] 
[1, 2, 3, 4] 
>>> ['this','is','a','list'] or ['and','here','is','another'] 
['this', 'is', 'a', 'list'] 

Une liste vide évalue comme « faux-y », donc dans ces soins, la liste de droite est la valeur de la déclaration:

>>> [] or ['and','here','is','another'] 
['and', 'here', 'is', 'another'] 

Permutation l'ordre des listes montre que le premier à évaluer en tant que vrai sera le résultat:

>>> ['and','here','is','another'] or ['this','is','a','list'] 
['and', 'here', 'is', 'another'] 

Pour obtenir ce que vous voulez, vous pouvez faire une compréhension de la liste comme

[ 
    y_item or z_item 
    for y_item, z_item 
    in zip(y, z) 
] 
+0

ou '[any (items) pour les éléments dans zip (y, z)]' –

+0

L'utilisation de 'any' renvoie le booléen valeur et non la valeur de la liste «véridique» elle-même, qui peut ou peut ne pas être ce que le PO veut. –