Python 字典在 url 中具有相同的解析键,因此必须订购

Python dictionary with same key for parsing in a url so must be ordered

我在尝试创建字典、对它进行排序并加入它以使用 urllib2 进行解析时遇到问题。 这是我的代码:

values = {'STR':'1',
       'STR':'123',
       'STR':'3456',
       'BAT':'95'}
ary_ordered_names = []
ary_ordered_names.append('STR')
ary_ordered_names.append('STR')
ary_ordered_names.append('STR')
ary_ordered_names.append('BAT')
queryString  = "&".join( [ item+'='+urllib.pathname2url(values[item]) for item in ary_ordered_names ] )
print queryString
url = 'url'
full_url = url + '?' + queryString
print full_url
request = urllib2.Request(url, queryString)
response  = urllib2.urlopen(full_url)
html = response.read()
print html

所以当我执行这个脚本时,它可以工作,但只发送最后一个 STR 值 3456,而不是其余的。 谁能帮我解决这个 python 字典问题? 提前致谢。

字典没有顺序,键必须是唯一的。相反,如果顺序很重要,则将 (key, value) 元组 的列表传递给 urllib.urlencode() 函数:

from urllib import urlencode

params = [('STR', '1'), ('STR', '123'), ('STR', '3456'), ('BAT', '95')]
query_string = urlencode(params)

演示:

>>> from urllib import urlencode
>>> params = [('STR', '1'), ('STR', '123'), ('STR', '3456'), ('BAT', '95')]
>>> urlencode(params)
'STR=1&STR=123&STR=3456&BAT=95'

您还可以使用值序列并为 doseq 参数传入 True

params = [('STR', ['1', '123', '3456']), ('BAT', '95')]
query_string = urlencode(params, True)

这会产生相同的输出:

>>> params = [('STR', ['1', '123', '3456']), ('BAT', '95')]
>>> urlencode(params, True)
'STR=1&STR=123&STR=3456&BAT=95'

如果 BATSTR 的相对顺序无关紧要,您仍然可以使用字典,但对 STR 值使用一个序列:

params = {'STR': ['1', '123', '3456'], 'BAT': '95'}
query_string = urlencode(params, True)

然后 STR 值按顺序分组,但 BAT 参数可以在该组之后或之前结束:

>>> params = {'STR': ['1', '123', '3456'], 'BAT': '95'}
>>> urlencode(params, True)
'BAT=95&STR=1&STR=123&STR=3456'

如您所见,无法保证 python 字典中的顺序。

一个选项是使用 (key, value) 元组的列表。

另一种是使用OrderedDict。 [编辑:这只适用于没有任何重复键的情况。]