2017-07-28 1 views
1

J'ai débogué un programme que j'ai essayé de faire fonctionner correctement, et tout se résume à la première ligne de code ci-dessous. J'ai un dictionnaire de clés (chaîne) et de valeurs (entier). J'essaie de les classer par ordre croissant afin que je puisse obtenir le plus petit élément. Cependant, l'ordre des valeurs renvoyées n'a pas de sens. Il ne retourne pas le plus petit en premier, en fait il renvoie le plus grand (même si la documentation indique clairement qu'il devrait être dans l'ordre croissant). Ce n'est pas non plus dans l'ordre alphabétique, même si la première chaîne est AAAAA..AAA - mais elle ne suit pas un ordre alphabétique. Je ne sais même pas comment accéder aux éléments de ce qui est retourné par trié et de quel type il s'agit. D'après les erreurs que j'ai reçues en expérimentant, c'est une "liste". Comment puis-je résoudre ce problème? Cette ligne rend le calcul complètement faux.trié dict retourne n'a pas de sens/python

kmerMin = (sorted(topkmerdict,key=lambda x: x[1])) 
    print kmerMin 
    print kmerMin[0] 
    print topkmerdict[kmerMin[0]] 
+0

S'il vous plaît montrer à quoi 'topkmerdict' ressemble – asiviero

+0

S'il vous plaît lire et suivre les directives d'affichage dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. – Prune

+0

Je pense que vous pouvez corriger ceci avec une ligne pour assigner une valeur à 'topkmerdict', puis montrer la sortie que vous attendiez et ce que vous avez obtenu. – Prune

Répondre

2

Qu'est-ce que vous avez écrit retourne une liste des clés, triées par la valeur du 2ème caractère des clés du dict (x[1] choisit le 2ème caractère x clé).

Ce n'est pas clair que vous voulez à la place. Si, par exemple, vous voulez que les clés triées par leurs associés valeurs, puis est ici une façon de le faire:

>>> d = {"a": 12, "b": 6, "c": 3} 
>>> sorted(d, key=lambda k: d[k]) 
['c', 'b', 'a'] 

Une autre façon de faire exactement la même chose, plus vite, mais peut-être moins évident:

>>> sorted(d, key=d.__getitem__) 
['c', 'b', 'a'] 
2

J'ai un dictionnaire de clés (chaîne) et de valeurs (entier). J'essaie de les classer par ordre croissant afin que je puisse obtenir le plus petit élément.

Vous pouvez faire une liste des clés triées par les valeurs en utilisant __getitem__ comme key-function:

>>> topkmerdict = { 
     'ATCCCAGCACTTTGGGAGGCCGAGGCAGGT': 6, 
     'CTGTAATCCCAGCACTTTGGGAGGCCGAGG': 71, 
     'AGCACTTTGGGAGGCCGAGGCAGGTGGATC': 8, 
     'GGTGGCTCACGCCTGTAATCCCAGCACTTT': 53, 
     'TGTTTGAGTTCATTGTAGATTCTGGATATT': 8, 
     'CGGTGGCTCACGCCTGTAATCCCAGCACTT': 40, 
     'GTAATCCCAGCACTTTGGGAGGCCGAGGCA': 27, 
} 
>>> kmerMin = sorted(topkmerdict, key=topkmerdict.__getitem__) 
>>> kmerMin[0] 
'ATCCCAGCACTTTGGGAGGCCGAGGCAGGT' 
>>> topkmerdict[kmerMin[0]] 
6 

Si l'écriture __getitem__ semble trop bizarre, vous pouvez toujours utiliser un lambda pour la touche-fonction: kmerMin = sorted(topkmerdict, key=lambda k: topkmerdict[k]).

FYI, si tout ce que vous voulez est le plus petit élément, il n'y a pas besoin de faire un tri complet. La fonction min() serait plus propre, plus claire et beaucoup plus efficace:

>>> min(topkmerdict, key=topkmerdict.__getitem__) 
'ATCCCAGCACTTTGGGAGGCCGAGGCAGGT' 
+1

triés (topkmerdict, key = topkmerdict .__ getitem__) fait exactement ce que je voulais. Merci pour l'explication. – dusa

1

Je pense que vous verrez des résultats intéressants en changeant:

key=lambda x: x[1] 

à:

key=lambda x: x 

Ce triera vos clés basées sur la clé entière et pas seulement sur le second caractère.