Как найти все перестановки? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть список:

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

Я хочу построить np.array, содержащий все перестановки списка. Но есть предел, я хочу разделить матрицу поровну на 3 части по порядку. Для одинаковых комбинаций в детали потребуется только одна. Например:

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

и

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

будут одинаковыми, поэтому окончательный np.array должен иметь только один из них. Другой пример:

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

и

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

будут разными, потому что «n1, n2» первого списка и «n1, n3» второго списка находятся в первом часть. В последнем np.array есть они оба.

Как мне это сделать?

Любая помощь будет отличной!

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Думаю, я понимаю, что вы пытаетесь сделать. Следующий код не очень красивый, но он работает. Я беру все перестановки, а затем проверяю отсортированную уникальность по элементам в растущем списке, к которому я добавляю новые уникальные перестановки:

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)
0 голосов
/ 25 мая 2020

Измените форму ваших массивов, отсортируйте их по парам, конвертируйте в DataFrame и удалите дубликаты.

Предполагая, что lol - это ваш список списков:

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() 

пример:

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']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...