2010-07-27 7 views
5

d'accord, de sorte que selon la http://docs.python.org/library/urllib.htmlpython confondant urlencode ordre

« L'ordre des paramètres dans la chaîne codée va correspondre à l'ordre des paramètres tuples dans la séquence. »

sauf quand je tente d'exécuter ce code:

import urllib 
values ={'one':'one', 
     'two':'two', 
     'three':'three', 
     'four':'four', 
     'five':'five', 
     'six':'six', 
     'seven':'seven'} 
data=urllib.urlencode(values) 
print data 

sorties comme ...

seven=seven&six=six&three=three&two=two&four=four&five=five&one=one 

7,6,3,2,4,5,1?

Cela ne ressemble pas à l'ordre de mes tuples.

+1

vous n'êtes pas le passage d'une séquence de triplets. Puisque vous ne passez pas une suite de tuples, pourquoi citez-vous la documentation pour une suite de tuples? –

Répondre

20

Les dictionnaires sont intrinsèquement non ordonnés en raison de la façon dont ils sont implémentés. Si vous voulez à commander, vous devez utiliser une liste de tuples au lieu (ou un tuple de listes, ou un tuple de tuples, ou une liste de listes ...):

values = [ ('one', 'one'), ('two', 'two') ... ] 
+0

Oh, je vois. Je comprends. Ma faute. –

+3

@Neil: si c'est la bonne réponse, acceptez-la en cliquant sur la coche. –

5

Juste au cas où someones arrive ici comme moi la recherche d'une façon d'obtenir des résultats déterministes de urlencode, pour coder les valeurs que vous pouvez le faire par ordre alphabétique comme ceci:

from urllib.parse import urlencode 
values ={'one':'one', 
     'two':'two', 
     'three':'three', 
     'four':'four', 
     'five':'five', 
     'six':'six', 
     'seven':'seven'} 
sorted_values = sorted(values.items(), key=lambda val: val[0]) 
data=urlencode(values) 
print(data) 
#> 'five=five&four=four&one=one&seven=seven&six=six&three=three&two=two'