6
votes

Générer toutes les permutations de longueur n de Vrai / Faux?

Ce problème est survenu en essayant d'écrire du code pour une fonction de génération de table de vérité.

Comment puis-je générer une liste de listes de toutes les permutations de longueur n de Vrai et Faux? En d'autres termes, étant donné une liste d'éléments [True, False] , comment puis-je générer toutes les permutations de toutes les combinaisons longueur-n possibles de ces éléments?

Par exemple:

n = 2 longueur-2 permutations sont:

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

n = 3 la longueur- 3 permutations sont:

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

Je sais qu'il y a 2 ^ n listes dans cette liste. J'ai également envisagé d'utiliser itertools.product , mais cela ne semble donner que des permutations d'une combinaison spécifique . Dans ce cas, je pense que je veux générer des permutations de TOUTES les combinaisons d'une liste de longueur n de vrai / faux.


5 commentaires

Ce que vous demandez n'est pas clair ...


@ U9-Forward désolé, je ne suis pas très doué pour formuler les choses. J'ai ajouté un autre exemple.


Il existe d'autres fonctions dans le module itertools .


Êtes-vous sûr que c'est une permutation? Une permutation est «chacune de plusieurs manières possibles dans lesquelles un ensemble ou un nombre de choses peuvent être ordonnées ou arrangées». [True, True, True] n'est pas un réarrangement des valeurs True et False.


@ KM142646 et Zabop je préférerais dire "produit cartésien de l'ensemble {True, False}, n fois avec lui-même", je conviens que la liste de listes demandée n'est pas la même que l'ensemble des permutations de l'ensemble {True , False} (l'ensemble de permutation ne comporte que 2 éléments; {True, False} et {False, True}).


7 Réponses :


1
votes

Ce n'est pas une solution efficace mais vous pouvez utiliser:

def permuteBool(n, l):
...      if n==0:
...         return l
...      return [permuteBool(n-1, l+[True])] + [permuteBool(n-1, l+[False])]
... 
>>> permuteBool(3, [])
[[[[True, True, True], [True, True, False]], [[True, False, True], [True, False, False]]], [[[False, True, True], [False, True, False]], [[False, False, True], [False, False, False]]]]


0 commentaires

1
votes

MODIFIER: Il semble que je n'ai pas vérifié le résultat avant de publier ma réponse. Cela restera tel quel car la bonne manière serait une réponse en double de la bonne réponse.

Utilisez ce code simple:

>>> import itertools  # library of magic
>>> length = 3        # length of your wanted permutations
>>> result = itertools.combinations(    # combinations based on position
...     [*[True, False] * length],      # generates the items needed
...     length                          # length of the wanted results
... )
>>> print([list(r) for in result])
[[False, False, False], [False, False, True], [False, True, False], [False, True, True], [True, False, False], [True, False, True], [True, True, False], [True, True, True]]


8 commentaires

SyntaxError at (Vrai pour _ dans la plage (longueur),


Je l'ai réparé. Ouf, ça a pris un peu.


SyntaxError toujours, virgule manquante.


C'est pourquoi je suis censé être au lit en ce moment: D Si somnolent haha.


la dernière ligne doit être: [list (r) for r in result], sinon syntaxerror


Donc ce que vous voulez, c'est, imo: import itertools # library of magiclength = 3 # length de vos permutations désirées length = 3 result = itertools.combinations (# combinaisons basées sur la position [* [True, False] * length], # génère le éléments nécessaires longueur # longueur des résultats recherchés) [list (r) for r in result]


Même avec la faute de frappe r corrigée, cela imprime quelque chose de complètement faux et complètement différent de ce que vous prétendez qu'il imprime .


combinaisons n'est pas le bon outil pour ce travail. Au mieux, vous pouvez obtenir quelque chose qui surcharge les combinaisons et utilise set pour réparer les choses, ce qui est encore horriblement inefficace par rapport à l'utilisation de product .



13
votes

Utilisez product:

>>> import itertools
>>> l=[False,True]
>>> [list(i) for i in itertools.product(l,repeat=3)]
[[False, False, False], [False, False, True], [False, True, False], [False, True, True], [True, False, False], [True, False, True], [True, True, False], [True, True, True]]
>>> 

Et faites une liste:

>>> import itertools
>>> l=[False,True]
>>> list(itertools.product(l,repeat=3))
[(False, False, False), (False, False, True), (False, True, False), (False, True, True), (True, False, False), (True, False, True), (True, True, False), (True, True, True)]
>>> 


0 commentaires

5
votes

C'est relativement facile si vous considérez les valeurs comme des bits à la place. Comme pour le cas n = 3 , voyez-le comme une valeur contenant trois bits.

Boucle (en utilisant des entiers) de 0 à 2ⁿ - 1 (inclus) et affiche tous les bits de chaque valeur (avec 0 étant < code> False et 1 étant True ). Ensuite, vous aurez toutes les permutations.

Bien sûr, ce n'est pas une solution très pythonique, mais c'est générique.


2 commentaires

Wow, je n'ai même pas pensé à utiliser le binaire. Très intéressant.


Vous en avez un moi: D (Vous n'aimez pas ce jeu de mots? Deux mauvais)




2
votes

Et si vous voulez une liste de listes, pas une liste de tuples, commencez par U9-Forward répondez :

[list(elem) for elem in lll]

et continuez:

lll=[]
for each in ll:
    lll.append([EACH for EACH in each])


6 commentaires

Ce n'est pas la meilleure façon.


merci d'en partager un meilleur, je suis également intéressé


Regardez le mien alors. C'est aussi plus simple: D


Je pense que juste [list (elem) pour elem dans listTuples] le convertirait de manière appropriée


@zabop dans ma réponse.


@KevinMoy Je suis d'accord avec vous.



1
votes

Voici un simple programme de liste récursive

$ python3 exponential.py 5
[False, False, False, False, False]
[True, False, False, False, False]
[False, True, False, False, False]
[True, True, False, False, False]
[False, False, True, False, False]
[True, False, True, False, False]
[False, True, True, False, False]
[True, True, True, False, False]
[False, False, False, True, False]
[True, False, False, True, False]
[False, True, False, True, False]
[True, True, False, True, False]
[False, False, True, True, False]
[True, False, True, True, False]
[False, True, True, True, False]
[True, True, True, True, False]
[False, False, False, False, True]
[True, False, False, False, True]
[False, True, False, False, True]
[True, True, False, False, True]
[False, False, True, False, True]
[True, False, True, False, True]
[False, True, True, False, True]
[True, True, True, False, True]
[False, False, False, True, True]
[True, False, False, True, True]
[False, True, False, True, True]
[True, True, False, True, True]
[False, False, True, True, True]
[True, False, True, True, True]
[False, True, True, True, True]
[True, True, True, True, True]

Exemple de sortie

def list_exponential(n,set1=[]):
if n == 0:
    print(set1)
else:
    n-=1
    list_exponential(n, [False]+set1)
    list_exponential(n, [True]+set1)

list_exponential(5)


0 commentaires