2010-07-27 21 views
5

okay, secondo http://docs.python.org/library/urllib.htmlconfondendo pitone

"L'ordine dei parametri nella stringa codificata corrisponderà l'ordine delle tuple parametri nella sequenza."

tranne quando provo a fare funzionare questo codice:

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

uscite come ...

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

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

Questo non sembra l'ordine delle mie tuple.

+1

non sta passando una sequenza di tuple. Dal momento che non stai passando una sequenza di tuple, perché stai citando la documentazione per una sequenza di tuple? –

risposta

20

I dizionari sono intrinsecamente non ordinati a causa del modo in cui vengono implementati. Se si desidera loro di essere ordinati, è necessario utilizzare una lista di tuple invece (o una tupla di liste, o di una tupla di tuple o una lista di liste ...):

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

Oh, capisco. Capisco. Colpa mia. –

+3

@Neil: se questa è la risposta corretta, accettala facendo clic sul segno di spunta. –

5

nel caso in cui qualcuno arriva qui come me alla ricerca di un modo per ottenere i risultati deterministici da urlencode, per codificare i valori in ordine alfabetico si può fare in questo modo:

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'