2009-06-21 18 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'}。請注意,如果多個值的同一個關鍵字,則只會獲得最後一個關鍵字。