Comment effectuer une itération sur les éléments d'une carte en python
Donné une chaîne s
, je veux savoir combien de fois chaque caractère de la chaîne se produit. Voici le code:
def main() :
while True :
try :
line=raw_input('Enter a string: ')
except EOFError :
break;
mp={};
for i in range(len(line)) :
if line[i] in mp :
mp[line[i]] += 1;
else :
mp[line[i]] = 1;
for i in range(len(line)) :
print line[i],': ',mp[line[i]];
if __name__ == '__main__' :
main();
Lorsque j'exécute ce code et que je rentre abbba
, j'obtiens:
a : 2
b : 3
b : 3
b : 3
a : 2
Je voudrais seulement:
a : 2
b : 3
Je comprends pourquoi ce qui se passe, mais comme je suis nouveau sur python, je ne connais pas d'autres moyens pour effectuer une itération sur les éléments d'une carte. Quelqu'un pourrait-il me dire comment faire cela? Merci à l'avance.
Vous devez vous connecter pour publier un commentaire.
Vous pourriez essayer un Compteur (Python 2.7 et au-dessus; voir ci-dessous pour une pré-2.7 option):
Vous pouvez ensuite accéder aux éléments tout comme un dictionnaire:
Et à réitérer, vous pouvez utiliser @BurhanKhalid de la suggestion (la
Counter
se comporte comme un dictionnaire, où vous pouvez parcourir les paires clé/valeur):Si vous êtes à l'aide d'une pré-version 2.7 de Python, vous pouvez utiliser un
defaultdict
pour simplifier votre code un peu (le processus est toujours le même - la seule différence est que maintenant, vous n'avez pas à vérifier la clé de la première -, il sera par défaut à 0 si une clé correspondante n'est pas trouvé).Counter
a d'autres fonctions intégrées, mais si vous voulez simplement compte (et ne se soucient pas demost_common
, ou d'être en mesure desubtract
, par exemple), ce doit être fine et peuvent être traités comme n'importe quel autre dictionnaire:Lorsque vous utilisez
iteritems()
sur un dictionnaire (ou leCounter
/defaultdict
ici), une clé et une valeur est retournée pour chaque itération (dans ce cas, la clé étant la lettre et la valeur étant le nombre d'occurrences). Une chose à noter à propos de l'utilisation des dictionnaires, c'est qu'ils sont intrinsèquement non-ordonnée, de sorte que vous ne sera pas nécessairement obtenir'a', 'b', ...
pendant l'itération. Un moyen simple de parcourir un dictionnaire triés de manière serait d'itérer sur une liste triée des touches (ici alphabétique, maissorted
peuvent être manipulés pour traiter une variété d'options), et de renvoyer le dictionnaire de la valeur de cette clé (il y a d'autres façons, mais nous espérons que cela sera un peu informative):for k, v in Counter('aaaabbbcccddd').iteritems():
.iteritems()
vous permet d'économiser le dictionnaire supplémentaire de recherche à chaque itérationCounter
. Je suis certainement d'accord avec la mise à niveau, mais je l'ai abandonné dans une mise à jour (à l'aide dedefaultdict
, qui est également mentionné par Michael ci-dessous) que vous pouvez utiliser dans le noyau 2.6, si vous le souhaitez.De parcourir un mapping rendements clés.
collections.Counter
est un mappage, vous pouvez effectuer une itération sur un de la même manière.Vous devez chercher l'aide à la dict(). Tout est là -- 'pour k en mp' itère sur les touches, " pour v en mp.les valeurs de()' effectue une itération sur les valeurs, l' 'pour k,v en mp.les éléments()' itère sur la clé, des paires de valeurs.
Aussi, vous n'avez pas besoin de ces points-virgules. Alors qu'ils sont légaux en Python, personne ne les utilise, il y a à peu près pas de raison de le faire.
Python 2.5 et supérieur
collections.defaultdict
🙂