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'
如果 BAT
和 STR
的相对顺序无关紧要,您仍然可以使用字典,但对 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。 [编辑:这只适用于没有任何重复键的情况。]
我在尝试创建字典、对它进行排序并加入它以使用 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'
如果 BAT
和 STR
的相对顺序无关紧要,您仍然可以使用字典,但对 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。 [编辑:这只适用于没有任何重复键的情况。]