J'ai besoin de créer un ensemble d'ID de certains messages et les positions dans la liste d'origine. Le code est utilisé pour trier les messages et les gérer ultérieurement en fonction de l'ID.

Les œuvres suivantes sont lisibles, mais lentes.

import numpy as np
IDs=np.array([354,45,45,34,354])#example, the actual array is huge

Dict={}
for counter in xrange(len(IDs)):
    try:
        Dict[IDs[counter]].append(counter)
    except:
        Dict[IDs[counter]]=[counter]
print(Dict)
#{354: [0, 4], 34: [3], 45: [1, 2]}

Des idées pour l'accélérer? Il n'est pas nécessaire de trier les listes. Plus tard dans le code est utilisé comme suit, et après cela, le dict est rejeté

for item in Dict.values():
    Position_of_ID=Position[np.array(item)]
    ...
0
Okapi575 8 août 2016 à 13:08

3 réponses

Meilleure réponse

Mutch plus rapide utilise une "dictcompression"

Dict = {id:i for i, id in enumerate(IDs)}
0
Okapi575 26 avril 2017 à 07:03

Le code le plus rapide que j'ai trouvé est celui-ci. Il fait beaucoup plus de mathématiques, n'est pas aussi lisible et je ne suis pas fier, mais il est beaucoup plus rapide (même avec de grands tableaux):

    Sorted_positions_of_IDs=np.argsort(IDs,kind='mergesort')
    SortedIDs=IDs[Sorted_positions_of_IDs]
    Position=0    
    Position_last=-1
    Dict={}
    while(Position<len(Sorted_positions_of_IDs)):
        ID=SortedIDs[Position]
        Position_last=np.searchsorted(SortedIDs,ID,side='right')
        Dict[ID]=Sorted_positions_of_IDs[Position:Position_last]
        Position=Position_last

Quoi qu'il en soit, les bonnes idées seront appréciées.

0
Okapi575 9 août 2016 à 06:04

Essayez d'utiliser defaultdict et enumerate:

from collections import defaultdict    
Dict = defaultdict(list)
for i,id in enumerate(IDs):
    Dict[id].append(i)

(utiliser try et except est une mauvaise idée si les exceptions ne sont pas rares)

1
Community 23 mai 2017 à 10:31