J'ai une liste:

n = ['n1','n2','n3','n4','n5','n6']

Ce que je veux, c'est créer un np.array qui contient toutes les permutations de la liste. Mais il y a une limite que je veux diviser la matrice également en 3 parties dans l'ordre. Les mêmes combinaisons dans une partie n'en prendraient qu'une. Par exemple:

['n1','n2','n3','n4','n5','n6']

Et

['n2','n1','n3','n4','n5','n6']

Serait le même, donc le np.array final ne devrait avoir qu'un seul d'entre eux. Un autre exemple:

['n1','n2','n3','n4','n5','n6']

Et

['n1','n3','n2','n4','n5','n6']

Serait différent, car les "n1, n2" de la première liste et les "n1, n3" de la seconde liste sont tous deux dans la première partie. Le np.array final devrait les avoir tous les deux.

Comment fait-on ça?

Toute aide est la bienvenue!

0
Rick 25 mai 2020 à 20:53

3 réponses

Meilleure réponse

Je pense que je comprends ce que vous essayez de faire. Ce qui suit n'est pas très joli code mais cela fonctionne. Je saisis toutes les permutations, puis vérifie l'unicité triée par rapport aux éléments d'une liste croissante à laquelle j'ajoute de nouvelles permutations uniques:

from itertools import permutations

n = ['n1','n2','n3','n4','n5','n6']

# This will hold the collection of unique groupings
unique_groups = [[], [], []]

for x in permutations(n):
    # divide into groups, and sort to be able to compare against unique_groups
    sorted_groups = [sorted(x[0:2]), sorted(x[2:4]), sorted(x[4:6])]

    u1, u2, u3 = unique_groups
    s1, s2, s3 = sorted_groups

    # check that all three groups are unique, and append if so
    if (s1 not in u1) and (s2 not in u2) and (s3 not in u3):
        u1.append(s1)
        u2.append(s2)
        u3.append(s3)

# Helper function to flatten the 3x3 output lists into 9x1 :  
def flatten(l):
    return [item for sublist in l for item in sublist]

result = [flatten(l) for l in zip(*(unique_groups))]
print(result)
1
SimonR 25 mai 2020 à 18:35

Cela pourrait-il aider?

n = ['n1','n2','n3','n4','n5','n6','n7','n8','n9']
n1 = ['n1','n2','n3','n4','n5','n6','n7','n8','n91']

n = n + n1

n = list(dict.fromkeys(n))
print(n)

Sortie: ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n91']

0
casta 25 mai 2020 à 18:06

Remodelez vos tableaux, triez-les par paires, convertissez en DataFrame et supprimez les doublons.

En supposant que lol est votre liste de listes:

res=[]
for l in lol:
    new_l = np.sort(np.reshape(l,(-1,2))).reshape(1,-1)[0]
    res.append(new_l)
df=pd.DataFrame(res)
res = df.drop_duplicates().values.tolist() 

Exemple:

lol = [['n1','n2','n3','n4','n5','n6'],
       ['n2','n1','n3','n4','n5','n6'],
       ['n1','n3','n2','n4','n5','n6']]

res = [['n1', 'n2', 'n3', 'n4', 'n5', 'n6'],
       ['n1', 'n3', 'n2', 'n4', 'n5', 'n6']]
0
Binyamin Even 25 mai 2020 à 18:52