令人困惑的python urlencode命令

时间:2010-07-27 20:52:10

标签: python urlencode

好的,所以根据http://docs.python.org/library/urllib.html

“编码字符串中的参数顺序将与序列中参数元组的顺序相匹配。”

除非我尝试运行此代码:

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

输出为......

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

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

这看起来不像我元组的顺序。

3 个答案:

答案 0 :(得分:22)

由于字典的实现方式,字典本质上是无序的。如果您希望对它们进行排序,则应使用元组列表(或列表元组,或元组元组或列表列表......):

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

答案 1 :(得分:5)

为了防止有人来到这里,像我一样寻找从urlencode获得确定性结果的方法,要按字母顺序对值进行编码,你可以这样做:

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(sorted_values)
print(data)
#> 'five=five&four=four&one=one&seven=seven&six=six&three=three&two=two'

答案 2 :(得分:0)

为什么不使用OrderedDict?您的代码将如下所示:

from collections import OrderedDict

d = OrderedDict()
d['one'] = 'one'
d['two'] = 'two'
d['three'] = 'three'
d['four'] = 'four'
...

# Outputs "one one", "two two", "three three", "four four", ...
for key in d:
    print(key, d[key])

这样可以保留字典的顺序