如何阻止Python parse_qs将单个值解析为列表?

Sha*_*obe 41 python python-2.6

在python 2.6中,以下代码:

import urlparse
qsdata = "test=test&test2=test2&test2=test3"
qs = urlparse.parse_qs(qsdata)
print qs
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

{'test': ['test'], 'test2': ['test2', 'test3']}
Run Code Online (Sandbox Code Playgroud)

这意味着即使测试只有一个值,它仍然被解析为一个列表.有没有办法确保如果只有一个值,它不会被解析成一个列表,所以结果看起来像这样?

{'test': 'test', 'test2': ['test2', 'test3']}
Run Code Online (Sandbox Code Playgroud)

tuo*_*alo 117

对于想要一个简单的字典并且永远不需要具有相同键的多个值的人的旁注,请尝试:

dict(urlparse.parse_qsl('foo=bar&baz=qux'))
Run Code Online (Sandbox Code Playgroud)

这会给你一个很好的{'foo': 'bar', 'baz': 'qux'}.请注意,如果同一个键多个值,则只能获得最后一个值.

  • @MisterBhoot是的,这就是为什么我有围绕它的`dict(...)`调用.:) (15认同)
  • 我不好,对不起。我现在应该早点睡觉。 (3认同)
  • 这不起作用,它仍然是列表中的 query_params 的字典 (3认同)
  • `parse_qsl()` 不是给你一个键值对列表(而不是一个字典)吗? (2认同)

Sin*_*ion 25

你可以事后解决它......

import urlparse
qsdata = "test=test&test2=test2&test2=test3"
qs = dict( (k, v if len(v)>1 else v[0] ) 
           for k, v in urlparse.parse_qs(qsdata).iteritems() )
print qs
Run Code Online (Sandbox Code Playgroud)

但是,我不认为会想要这个.如果一个通常是列表的参数恰好只有一个项目集到达,那么我会有一个字符串而不是我通常收到的字符串列表.