J'ai une liste d'objets booléens
comme ceci:
[False, False, True, False]
Je veux bit et ces listes et obtenir le résultat:
[[True, True, True, False], [False, True, True, False], [False, False, True, True]]
Quelle est la meilleure façon de procéder?
3 Réponses :
Tant que vous utilisez boolean, vous pouvez zip et puis utilisez all :
[False, False, True, False]
Sortie
data = [[True, True, True, False], [False, True, True, False], [False, False, True, True]] result = [all(e) for e in zip(*data)] print(result)
Cela fait des et
logiques, pas des bits &
Puisque les bools ne sont qu'un peu, ne serait-ce pas pareil?
Je sais, le résultat est le même pour ce cas particulier. Mais puisque la question se pose spécifiquement ... ;-)
@schwobaseggl Merci, vous êtes tous la bonne réponse à ce que je voulais. J'ai changé le titre et le contenu de ma question en objets booléens
, donc je choisis cette réponse comme solution.
Vous pouvez utiliser functools.reduce
et le bitwise "et" operator.and_
, ainsi que le zip (* ...)
motif de transposition:
from functools import reduce from operator import and_ lst = [[True, True, True, False], [False, True, True, False], [False, False, True, True]] [reduce(and_, x) for x in zip(*lst)] # [False, False, True, False]
Ce serait le cas, mais c'est sémantiquement incorrect car il n'y a pas de mise à jour sur place (ne confondez pas reduction
avec in-place). Notez que &
et & =
sont deux opérateurs entièrement différents. Chaque type peut les surcharger à sa guise. Que, pour de nombreux types, a = a & b
et a & = b
sont équivalents, est purement conventionnel.
Si vous souhaitez utiliser spécifiquement l'opérateur &
au niveau du bit, vous pouvez utiliser functools.reduce
avec zip
:
>>> def bitwise_and(x, y): ... return x & y ... >>> [reduce(bitwise_and, lst) for lst in zip(*l)] [False, False, True, False]
Nous pouvons également créer notre propre mini-fonction pour remplacer lambda
:
>>> from functools import reduce >>> l = [[True, True, True, False], [False, True, True, False], [False, False, True, True]] >>> [reduce(lambda x, y: x & y, lst) for lst in zip(*l)] [False, False, True, False]
Ou utilisez simplement le module opérateur
, comme indiqué dans Réponse de @ schwobaseggl .
Ce n'est pas une liste de bits. C'est une liste d'objets
bool
.@ juanpa.arrivillaga Merci, j'ai édité.