Улучшить алгоритм раскрытия списка

У меня есть такая структура данных [[1,2,3],...,[5,6,7]]. Необходимо каждый список раскрыть в следующем виде:

[
[1, [2, 3]],
[2, [1, 3]],
[3, [1, 2]],
]

Таким образом, при поступлении на вход [[1,2,3],[8,9],[5,6,7]], будет получено:

[
    [1, [2, 3]],
    [2, [1, 3]],
    [3, [1, 2]],
    [8, [9]],
    [9, [8]],
    [5, [6, 7]],
    [6, [5, 7]],
    [7, [5, 6]],
]

] Сейчас я написал следующую функцию:

def disclose_list(dlist):
    tmp = []
    new = []
    for i in tqdm.tqdm(dlist):
        for j in i:
            tmp = i.copy()
            tmp.remove(j)
            new.append([j, tmp])
    return new

Она работает, но медленно и ест ОЧЕНЬ много памяти. Для оценки масштабов проблемы - передаю я в нее 4754243 таких списка и это далеко не предел. Можно ли как-то улучшить эту функцию? В первую очередь по использованию памяти, потому что ест она ну очень много.


Ответы (1 шт):

Автор решения: strawdog

Не уверен, что у вас получится оптимизировать код без внешних модулей. я бы посоветовал сделать что-то типа этого:

import itertools

a = [1,2,3]
mut = itertools.permutations(a)
res = set((x[0],tuple(sorted(x[1:]))) for x in list(mut))
print(res)
# {(3, (1, 2)), (2, (1, 3)), (1, (2, 3))}

я, кстати, не уверен в сильном улучшении эффективности, поскольку пермутация для больших списков - довольно емкое занятие.

→ Ссылка