2009-06-21 9 views
29

, aşağıdaki kod:Python parse_qs, tek değerleri listelere ayrıştırmayı nasıl durdurur? python 2.6 olarak

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

şu çıktıyı verir: testi için tek değer olsa bile, yine de bir listeye çözümlenen devam ettiği anlamına gelir

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

. Tek bir değer varsa, listeye ayrıştırılmadığından emin olmanın bir yolu var mı, böylece sonuç böyle görünecek?

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

Tüm değerlerin listenin daha tutarlı olması değil, bir liste veya tek bir değer olduğunda endişelenmenize gerek yok, neden olmasın? –

+3

HTTP standardı, bunun bir liste olması gerektiği anlamına gelir. Çok fazla alternatif yok gibi görünüyor. –

cevap

24

sonradan düzeltmek olabilir ...

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 

Ancak, ben bu isteyeyim sanmıyorum. Normalde bir liste olan bir parametre yalnızca bir öğe kümesiyle gelirse, normalde aldığım dizelerin listesi yerine bir dizim olurdu.

99

birisi sadece basit bir sözlük isteyen ve asla aynı anahtarla birden çok değeri ihtiyacı için bir sidenote, deneyin:

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

Bu sana güzel {'foo': 'bar', 'baz': 'qux'} verecektir. Aynı anahtar için birden fazla değer varsa, yalnızca sonuncuyu alacağınızı unutmayın.

+0

Parse_qsl() ', size anahtar-değer çiftlerinin bir listesini vermez (ve bir dict değil)? –

+11

@MisterBhoot Evet, işte bu yüzden "dict (...)" adlı çağrıya sahibim. :) – tuomassalo

+0

Benim pardon, üzgünüm. Şimdi erken uyumaya başlamalıyım. –