4 votes

Algorithme efficace pour obtenir l'indice le plus bas d'éléments uniques dans une liste 3D.

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]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X