2017-05-20 5 views
0

Ich habe diese QueryDict:Wie extrahiert man Elemente aus einem QueryDict, das Schlüssel mit mehr als einem Wert enthält?

>>> from django.http import QueryDict 
>>> q = QueryDict('a=1&a=2&c=3') 

Ich brauche ein Stück Code, die dieses Ergebnis zurückgibt:

{ u'a': [u'1',u'2'], u'c': u'3'} 

ich Sie informieren, dass dict(q.iterlists()) gibt diese:

{ u'a': [u'1', u'2'], u'c': [u'3']} 

Grüße,

+2

Können Sie erklären, warum Sie den ersten Fall wollen? Was ist das Problem mit "c": [u '3'] 'Wenn Sie Schwierigkeiten haben, das Wunschergebnis durch Indizierung zu erhalten, können Sie einfach' q ['c'] [0] 'machen. – Kasramvd

+0

Da es nur einen Wert hat, möchte ich keine Liste sein. @Kasramvd –

+0

Sie bekommen eine Liste nach der Iteration, dann danach zupfen Sie, wenn Sie Daten wie q ['c'] möchten – Exprator

Antwort

2

Kürzere Antwort:

{ 
    key:val if len(val)>1 else val[0] 
    for key,val in q.lists() 
} 
+1

Wert von Schlüssel c ist immer noch Unicode – timgeb

+0

Entschuldigung für meinen Fehler. Die Unicode-Ausgabe muss nicht geändert werden. Ich habe meine Frage korrigiert. Vielen Dank für Ihre Antwort. @timgeb –

+0

@timgeb Ja, natürlich. Danke. –

1

Wenn Sie die QueryDict wollen in json umgewandelt werden,

Sie so etwas tun könnte,

>>> from django.http import QueryDict 
>>> q = QueryDict('a=1&a=2&c=3') 
>>> q 
<QueryDict: {'c': ['3'], 'a': ['1', '2']}> 

Ich habe es tatsächlich wie diese,

>>> string_dict = json.loads(json.dumps(dict(q))) 
>>> string_dict 
{'c': ['3'], 'a': ['1', '2']} 

>>> for item in string_dict: 
...  if len(string_dict[item]) == 1: 
...   string_dict[item] = string_dict[item][0] 
... 
>>> string_dict 
{'c': '3', 'a': ['1', '2']} 
+0

Entschuldigung für meinen Fehler. Die Unicode-Ausgabe muss nicht geändert werden. Ich habe meine Frage korrigiert. Vielen Dank für Ihre Antwort. –

1

Ich stimme dem zu Kommentare, die Sie sollten dies nicht wollen.

Wie auch immer, wird diese Verständnis für die Unicode-Strings zu befreien (auch hier sollten Sie dies nicht wollen) und Einzelwertelisten:

d = { 'a': ['1', '2'], 'c': [u'3']} 
>>> {k:(map(str, v) if len(v) > 1 else str(v[0])) for k,v in d.items()} 
{'a': ['1', '2'], 'c': '3'} 
+0

Entschuldigung für meinen Fehler. Die Unicode-Ausgabe muss nicht geändert werden. Ich habe meine Frage korrigiert. Vielen Dank für Ihre Antwort. –

+0

@MahyarDamavand kein Problem, stellen Sie sicher, Ihre Eingabe und das erwartete Ergebnis in der Zukunft zu überprüfen, um Downvotes zu vermeiden und bessere Antworten zu erhalten. – timgeb

Verwandte Themen