2010-11-08 10 views
2

J'ai l'impression qu'il me manque quelque chose d'évident ici!Python looping ne semble pas suivre la séquence?

seq = {'a': ['1'], 'aa': ['2'], 'aaa': ['3'], 'aaaa': ['4'], 'aaaaa': ['5']} 
for s in seq: 
    print s 

sorties:

a 
aa 
aaaa 
aaaaa 
aaa 

wheras sûrement, il doit envoyer:

a 
aa 
aaa 
aaaa 
aaaaa 

ce qui ne va pas ici?

merci :)

+3

dupliquée http://stackoverflow.com/questions/613183/python-sort-a- dictionary-by-value et http://stackoverflow.com/questions/575819/sorting-a-dictionary-in-python – jargalan

Répondre

14

Les dictionnaires ne sont pas commandés. Si vous devez vous fier à la commande, vous avez besoin d'un OrderedDict - il y en a un dans le module collections dans Python 2.7, ou vous pouvez utiliser l'une des nombreuses recettes disponibles.

+1

Vous pouvez également vouloir souligner qu'un OrderedDict n'est pas un dictionnaire trié. Un OrderedDict conserve simplement l'ordre dans lequel les clés ont été ajoutées. –

1

pourquoi vous ne le faites pas (dictionnaire ne sont pas ordonnés):

for s in range(5): 
    print 'a'*s 

Edit: ok comme vous qui :)

la chose est dans l'expression: 'a'*s qui signifie crée une nouvelle chaîne contenant l'heure s 'a'.

dans l'interpréteur python vous pouvez jouer avec (python est pas merveilleux :))

>>> print 'a'*2 
aa 
>>> print 'a'*3 
aaa 

PS: si vous êtes nouveau python je suggère que vous utilisez ipython si vous ne le faites pas utilisez-le pour l'instant.

+0

pour s dans la gamme (1, len (seq)): \t imprimer 'a' * s – significance

+0

btw pourriez-vous le décomposer un peu pour moi, je suis nouveau à python et ne comprends pas le 'a' * s peu. – significance

+0

@significance: Si vous multipliez une chaîne par un entier en python, la chaîne est répétée autant de fois (cela fonctionne pour n'importe quelle séquence en python). –

5

Les dictionnaires Python standard ne sont pas commandés: il n'y a aucune garantie sur l'ordre dans lequel les clés seront retournées.

Si vous souhaitez que vos clés soient retournées dans l'ordre dans lequel vous créez les clés, vous pouvez utiliser un OrderedDict from collections.

Sinon, si vous voulez que votre sortie triée sur les valeurs des clés suivantes ferait:

for s in sorted(seq): 
    print s 
+0

également facile à trier par la longueur des clés 'pour s dans trié (seq, clé = len):' (même ordre dans ce cas si) –