2010-07-27 24 views
5

bien, así que de acuerdo con http://docs.python.org/library/urllib.htmlconfundir pitón

"El orden de los parámetros en la cadena codificada coincidirá con el fin de tuplas de parámetros de la secuencia."

excepto cuando trato de ejecutar este código:

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

salidas como ...

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

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

Eso no se ve como el orden de mis tuplas.

+1

no está de paso una secuencia de tuplas. Como no está pasando una secuencia de tuplas, ¿por qué está citando la documentación para una secuencia de tuplas? –

Respuesta

20

Los diccionarios están inherentemente desordenados debido a la forma en que se implementan. Si usted quiere que ser ordenados, se debe utilizar una lista de tuplas en lugar (o un tupla de listas, o una tupla de tuplas, o una lista de listas ...):

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

Oh, ya veo. Entiendo. Mi error. –

+3

@Neil: si esta es la respuesta correcta, acéptela haciendo clic en la marca de verificación. –

5

Sólo en caso de alguien llega aquí como yo en busca de una manera de obtener resultados deterministas de urlencode, para codificar los valores alfabéticamente puede hacerlo de esta manera:

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'