Улучшить алгоритм раскрытия списка
У меня есть такая структура данных [[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 шт):
Не уверен, что у вас получится оптимизировать код без внешних модулей. я бы посоветовал сделать что-то типа этого:
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))}
я, кстати, не уверен в сильном улучшении эффективности, поскольку пермутация для больших списков - довольно емкое занятие.