Python 字典具有相同的键用于在 url 中进行解析,因此必须进行排序

Rob*_*Sos 0 python urllib2

我在尝试创建字典、对其进行排序并将其加入以使用 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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 6

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

from urllib import urlencode

params = [('STR', '1'), ('STR', '123'), ('STR', '3456'), ('BAT', '95')]
query_string = urlencode(params)
Run Code Online (Sandbox Code Playgroud)

演示:

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

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

params = [('STR', ['1', '123', '3456']), ('BAT', '95')]
query_string = urlencode(params, True)
Run Code Online (Sandbox Code Playgroud)

这会产生相同的输出:

>>> params = [('STR', ['1', '123', '3456']), ('BAT', '95')]
>>> urlencode(params, True)
'STR=1&STR=123&STR=3456&BAT=95'
Run Code Online (Sandbox Code Playgroud)

如果彼此的顺序BAT和相对关系并不重要,您仍然可以使用字典,但对值使用序列:STRSTR

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

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

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