0
votes

Comment effectuer efficacement un dictionnaire fusionner?

Pour un problème, je résolvez, j'ai une liste de dictionnaires. Le problème concerne plusieurs requêtes du formulaire fusionné (A, B, C) . Fusion des moyens, dans le résultat, le nombre de touches communes est ajouté / soustrait et des touches peutractées et peu communes (et leurs valeurs) sont annexées, comme c'est le cas.

Je suis actuellement en train d'utiliser COLLECTION PYTHON. Les dictionnaires et effectuent la fusion comme suit: xxx

Bien qu'il s'agisse d'une solution commode, dans le problème, il peut y avoir jusqu'à 10 ** 5 requêtes. Sur une telle échelle, l'utilisation de cette approche est trop lente. Existe-t-il une meilleure approche pour résoudre ce problème?

Remarque: le pré-calcul des requêtes de fusion n'est pas pratique car le nombre d'entrées possibles est très grand. < P> Exemple: xxx


12 commentaires

Un exemple démontrant la fusion de fusion nous aiderait à mieux comprendre votre question


Que savez-vous des clés?


@Sachinpatel Ajouté en édition


Où est-ce que 1: 3 vient?


@Susmitagwal Le compte pour la clé "1" est 5 dans le premier compteur et "2" dans le dernier. Étant donné que l'agrégation est effectuée en tant que + B - C, le nombre est soustrait "1": (5-2 = 3)


@Mbo Dans le contexte de ce problème, le dictionnaire stocke les principaux facteurs d'un nombre. Ainsi, les clés sont des facteurs premiers d'un nombre donné et la valeur correspondante représente la puissance de cette prime dans la factorisation principale d'un nombre.


Les clés sont donc des entiers et leur gamme et leur nombre sont très limités (jusqu'à ce que vous ayez besoin de factoriser énormes numéros)?


@Mbo Les chiffres à factoriser sont inférieurs à 10 ** 6. Cependant, la factorisation principale a été pré-calculée et le compteur correspondant peut être récupéré en O (1).


Vous pouvez donc utiliser une liste simple des entiers (ou une matrice numpue) de longueur 1000 pour stocker des nombres premiers et utiliser avec des compteurs aussi vite que possible (vous n'avez pas besoin d'universalisme de compteur basé sur le dictionnaire et de surcharge correspondante pour le calcul de hachage, etc.).


Multiplication simple / division des nombres SELELES (sans factorisation) pourrait également être assez rapide (ne peut pas être sûr sans connaître le problème principal)


@Mbo, mais qu'en est-il du cas lorsque le nombre est une prime supérieure à 1000? Le nombre premier d'une telle valeur ne sera pas accueilli dans la liste de la taille 1000.


Je ne connais pas la solution de consisage pour ce cas (tandis que 10 ^ 6 longueurs de longueur est assez fiable).


3 Réponses :


0
votes

Essayez ceci - xxx

alors vous pouvez appeler comme ceci - xxx

Veuillez noter que j'ai "- 2" dans la troisième dict pour la logique de soustraction.


0 commentaires

0
votes

Vous pouvez utiliser ** kwargs ici xxx

si vous souhaitez optimiser les performances, vous devez utiliser plusieurs requêtes que vous devez utiliser "Caching + Dictionnaire" car la table de recherche est toujours plus rapide que tout opération


0 commentaires

0
votes

Mon premier instinct est de rechercher quelque chose comme l'opérateur JavaScript "Spread" pour Python:

https://mlpipes.com/Object-spread-opérator-python/ p>

Exemple ici: P>

DICTLIST[d] = {**a,**b,**c}


0 commentaires