J'ai dix colonnes: n1, n2, n3, n4, n5, n6, n7, n8, n9, n10.

Les valeurs d'une seule ligne doivent totaliser exactement 10 et toutes les valeurs doivent être des entiers non négatifs inférieurs ou égaux à 5.

J'aimerais faire un DataFrame avec toutes les permutations possibles selon les contraintes que je viens de décrire. L'ordre est important (c'est-à-dire que [5,5,0,0,0,0,0,0,0,0] et [5,0,5,0,0,0,0,0,0,0] doivent les deux sont des lignes séparées).

Voici ma tentative:

import itertools as it

permutations = [i for i in it.permutations(range(0,6), 10) if sum(i)==10]

df = pd.DataFrame(data=permutations,columns=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10'])

Le problème est qu'il n'y a aucune ligne dans df. Le tableau permutations est vide. Je ne vois pas pourquoi. Si je remplace it.permutations par it.combinations_with_replacement, la longueur de la liste résultante est 30. Pourquoi it.permutations ne renvoie rien?

0
wubbadubba 5 juin 2020 à 01:05

3 réponses

Meilleure réponse

C'est une solution facile!

Puisque l'ordre compte, vous recherchez en fait itertools.product (je sais, c'est un nom étrange). Voici la documentation: https://docs.python.org/3/ library / itertools.html # itertools.product.

Solution:

import itertools as it
permutations = [i for i in it.product(range(6), repeat=10) if sum(i) == 10]
3
Thomas Breydo 4 juin 2020 à 23:21

Vous ne pouvez pas obtenir une permutation de 10 éléments à partir d'une liste de 6 éléments. (Peut-être que «permutation» ne veut pas dire ce que vous pensez que cela signifie.)

Voici une façon d'obtenir ce que vous voulez (même si cela va prendre un certain temps):

permutations = []
for p in [i for i in it.combinations_with_replacement(range(0,6), 10) if sum(i)==10]:
    permutations += [x for x in set(it.permutations(p))]

(Explication: chaque p est un moyen de choisir 10 ensembles de valeurs avec la somme appropriée. Nous utilisons permutations pour trouver tous les moyens d'ordonner cet ensemble de valeurs.)

1
Scott Hunter 4 juin 2020 à 22:32

Vous avez choisi la mauvaise façon de répéter les choses.

import itertools as it

permutations = [i for i in it.product(*it.repeat(range(6),10)) if sum(i)==10]

df = pd.DataFrame(data=permutations,columns=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10'])

Cela devrait donner environ 85228 résultats.

1
Tammo Heeren 4 juin 2020 à 22:33