Configuration
Étant donné une liste de listes de listes, comme celle qui suit :
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)
Ce qui pourrait donner :
[[[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]]]
Objectif final
Je veux obtenir l'indice le plus bas où un élément apparaît, et retourner cette sortie sous la forme d'un dictionnaire, par exemple :
{0: {1, 17, 19, 4, 8, 11}, 1: {5, 9, 13, 14, 15, 16, 18}, 2: {3, 12, 6}}
Par exemple, dans lll
ci-dessus, 8
apparaît dans 3 sous-listes. Mais sa position la plus basse dans une seule sous-liste est à 0
C'est pourquoi il se trouve dans le dictionnaire final à la clé. 0
.
Contrainte
Je dois itérer sur lll
(mon cas d'utilisation suppose que je ne connaisse pas l'intégralité de la lll
). Par conséquent, le traversal_dct
s'accumuleront au fil du temps. Le site lll
L'image ci-dessus est une donnée fictive à des fins de démonstration.
Solution de travail
Cette approche actuelle fonctionne, mais je suis sûr qu'elle pourrait être plus efficace.
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]