Настройка
Приведен список списков списков, например, приведенный ниже:
lll = []
for _ in range(5):
ll = [random.sample(range(1, 20), 5),
random.sample(range(1, 20), 5),
random.sample(range(1, 20), 5)]
lll.append(ll)
Что может дать:
[[[1, 15, 12], [8, 5, 13], [1, 9, 12]],
[[4, 1, 19], [11, 18, 3], [8, 14, 6]],
[[17, 8, 4], [1, 16, 3], [19, 13, 11]]]
Конечная цель
Я хочу получить самый низкий индекс, который появляется элемент, и вернуть этот вывод в виде словаря, например:
{0: {1, 17, 19, 4, 8, 11}, 1: {5, 9, 13, 14, 15, 16, 18}, 2: {3, 12, 6}}
Например, в lll
выше, 8
появляется в 3 подсписках. Но его самая низкая позиция в отдельном подсписке - 0
, поэтому она находится в последнем словаре с ключом 0
.
Ограничение
Я должен повторить более lll
(в моем сценарии использования предполагается, что я не знаю полного lll
). Поэтому traversal_dct
будет расти со временем. lll
, показанный выше, является фиктивными данными для демонстрационных целей
Рабочий раствор
Этот текущий подход работает, но я уверен, что он мог бы быть более эффективным.
traversal_dct = {}
for ll in lll:
llT = [*map(list, zip(*ll))]
for i,xs in enumerate(llT):
if i not in traversal_dct.keys():
traversal_dct[i] = set()
traversal_dct[i] = traversal_dct[i].union(set(xs))
for i1,key1 in enumerate(traversal_dct.keys()):
for i2,key2 in enumerate(traversal_dct.keys()):
if i2 > i1:
traversal_dct[i2] = traversal_dct[i2] - traversal_dct[i1]