2009-06-21 140 views
29

在Python 2.6中,下面的代码:如何停止Python parse_qs将单个值解析为列表?

import urlparse 
qsdata = "test=test&test2=test2&test2=test3" 
qs = urlparse.parse_qs(qsdata) 
print qs 

提供了以下的输出:

{'test': ['test'], 'test2': ['test2', 'test3']} 

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

{'test': 'test', 'test2': ['test2', 'test3']} 
+10

是不是更一致,所有的值都是列表,你不必担心,如果它是一个列表或单个值,你为什么要另外? – 2009-06-21 15:30:31

+3

HTTP标准意味着它必须是一个列表。似乎没有太多的选择。 – 2009-06-21 20:51:18

回答

24

你可以事后修复它...

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 

不过,我不认为我想要这个。如果一个通常是列表的参数碰巧只有一个项目集,那么我会有一个字符串,而不是我通常收到的字符串列表。

99

一种人只是想简单的字典,从来没有需要使用相同的密钥多个值的阿里纳斯尝试:

dict(urlparse.parse_qsl('foo=bar&baz=qux')) 

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