Trouver des clés correspondantes dans deux grands dictionnaires et le faire rapidement
Je suis en train d'essayer de trouver des clés correspondantes dans les deux dictionnaires. Chacun a environ 600k entrées.
Dire par exemple:
myRDP = { 'Actinobacter': 'GATCGA...TCA', 'subtilus sp.': 'ATCGATT...ACT' }
myNames = { 'Actinobacter': '8924342' }
Je veux afficher la valeur pour Actinobacter (8924342) car il correspond à une valeur dans myRDP.
Le code suivant fonctionne, mais c'est très lent:
for key in myRDP:
for jey in myNames:
if key == jey:
print key, myNames[key]
J'ai essayé ce qui suit, mais il en résulte toujours dans un KeyError:
for key in myRDP:
print myNames[key]
Est là peut-être une fonction implémentée en C pour le faire? J'ai googlé autour, mais rien ne semble fonctionner.
Grâce.
source d'informationauteur Austin Richardson
Vous devez vous connecter pour publier un commentaire.
Utiliser des ensembles, parce qu'ils ont un
intersection
méthode qui devrait être rapide:Vous pourriez faire ceci:
Votre première tentative a été lent car vous avez été en comparant chaque clé dans myRDP avec chaque clé dans myNames. Algorithmique jargon, si myRDP a n éléments et myNames a m éléments, alors que l'algorithme prendrait O(n×m) opérations. Pour 600k éléments de chaque, c'est 360,000,000,000 comparaisons!
Mais de tester si un élément particulier est l'une des clés d'un dictionnaire est rapide -- en fait, c'est l'une des caractéristiques déterminantes de dictionnaires. Algorithmique termes, la
key in dict
test est O(1), ou constante de temps. Donc, mon algorithme prendra O(n), qui est l'une de 600 000 ème de l'époque.dict.get
retourne la valeur par défaut de la donner (dans ce cas,None
) si la clé n'existe pas.Vous pourriez commencer par trouver les clés communs et puis en itérant sur eux. Définir les opérations doivent être rapides, car ils sont mis en œuvre en C, au moins dans les versions modernes de Python.
en python 3, vous pouvez simplement faire
myNames.keys() & myRDP.keys()
Utiliser le
get
plutôt la méthode:Copier les deux dictionnaires en un dictionnaire/matrice. Cela a un sens, comme vous l'avez 1:1 les valeurs liées. Ensuite, vous avez besoin que d'une recherche, pas de comparaison boucle, et peut accéder à la valeur liée directement.
Exemple Dictionnaire/Tableau:
...
Voici mon code pour faire des intersections, les syndicats, les différences et les autres opérations sur les dictionnaires: