2010-08-12 3 views
0
r_dict={'answer1': "value1",'answer11': "value11",'answer2': "value2",'answer3': "value3",'answer4': "value4",} 

    for i in r_dict: 
     if("answer" in i.lower()): 
      print i 

    Result is answer11,answer2,snswer4,answer3 

J'utilise Python 2.4.3. Y at-il un moyen d'obtenir l'ordre dans lequel il est peuplé?Commander dans le dictionnaire Python (2.4)

Ou existe-t-il un moyen de le faire par expression régulière puisque j'utilise l'ancienne version de Python?

+0

Qu'est-ce que '" answer ## "'? – katrielalex

+0

S'il vous plaît voir la modification. – Hulk

+0

Peut-être modifier le titre de la question pour indiquer que vous êtes sur python 2.4.x ou pour indiquer que collections.OrderedDict n'est pas une option. – whaley

Répondre

2

dictionnaires ne sont pas ordonnés - c'est, ils ont un peu d'ordre, mais il est influencé de manière non évidentes par l'ordre d'insertion et le hachage des clés. Cependant, il existe une autre implémentation qui se souvient de l'ordre d'insertion, collections.OrderedDict.

Éditer: Pour Python 2.4, il existe plusieurs implémentations de tiers. Je n'en ai pas utilisé, mais depuis the one from voidspace semble prometteur.

+0

il est sur Python 2.4.3. OrderedDict est nouveau à partir de la 2.7. – whaley

+0

Oui, déjà vu cela et ajouté une solution 2.4. – delnan

+0

+1 pour l'implémentation de l'espace vide. Je n'étais pas au courant de cela auparavant. – whaley

1

Pas seulement en utilisant le dictionnaire lui-même. Les dictionnaires en Python (et une bonne partie des structures de données non spécialisées équivalentes qui impliquent le mappage) ne sont pas triés.

Vous pouvez potentiellement sous-classe dict et remplacer les méthodes __setitem__ et __delitem__ pour ajouter/supprimer chaque clé à une liste interne où vous gérez votre propre tri. Vous devrez probablement alors remplacer les autres méthodes, telles que __iter__ pour obtenir le tri que vous voulez sortir de votre boucle for.

... ou tout simplement utiliser le odict module comme @delnan suggested

0

Réponse courte: non. Les dictionnaires Python sont fondamentalement non ordonnés.

1

Un dictionnaire est par construction non ordonné. Si vous voulez un ordre un, utilisez un collections.OrderedDict:

import collections 
r_dict = collections.OrderedDict([ ('answer1', "value1"), ('answer11', "value11"), ('answer2', "value2"), ('answer3', "value3"), ('answer4', "value4") ]) 

for i in r_dict: 
    if("answer" in i.lower()): 
     print i 
+0

J'utilise python 2.4.3 Je pense que cela peut ne pas être possible – Hulk

+0

'collections' a été introduit dans Python 2.4, je crois. L'as tu essayé? – katrielalex

+0

Ah, excuses. 'collections' a en effet été introduit dans Python 2.4, mais' OrderedDict' n'a été ajouté qu'au 2.7. Si vous avez besoin de cette fonctionnalité, il est probablement plus facile de faire une liste de tuples [(key, value)] et de gérer vous-même l'unicité. – katrielalex