2016-06-03 12 views
1

In meiner Formular-Post-Anfrage greife ich alle Formularinformationen, aber es scheint, dass es einige leere Schlüssel und Werte gibt. Ich möchte alle Instanzen von leeren Schlüsseln und Werten entfernen. Das was ich bisher habe und es funktioniert offensichtlich nicht.So entfernen Sie dict Schlüssel, wenn der Wert leer ist

post_dict = dict(request.POST) 
item_data = {} 

for key, value in post_dict.items(): 
    if value is None: 
     del post_dict[key] 
    field = key.split('[')[1].replace(']', '') 
    item_data[field] = ''.join(value) 

print(item_data) 

Was der Druck item_data wie folgt aussieht:

{'': '', 'username': 'johndoe', 'email': '[email protected]', ... 

Wenn Sie den Schlüssel löschen, wird es seinen jeweiligen Wert löschen? Wie kann ich leere Schlüssel und Werte loswerden?

+0

Willst du 'if value == '''? – JETM

+1

'wenn der Wert None ist, wird nur das genaue Objekt' None' abgeglichen. Wenn Sie nur die Werte [false-y] (https://docs.python.org/2/library/stdtypes.html#truth-value-testing) entfernen möchten ('None',' '' '' '' ' , '[]', ...) verwenden 'falls nicht Wert:'. – jonrsharpe

+1

Nach dem Löschen sollten Sie wahrscheinlich mit der nächsten Iteration der Schleife fortfahren. – Barmar

Antwort

0

die Sie interessieren,

post_dict = {'': '', 'item_data[username]': ['johndoe'], 'item_data[email]': ['[email protected]'], 'item_data[campus]': ['madison']} 
item_data = {} 

for key, value in post_dict.items(): 
    strlist = key.split('[') 
    if len(strlist) == 1: 
     continue 

    new_key = strlist[1].replace(']', '') 
    new_value = ''.join(value) 

    # add to the dict if both new_key and new_value are non-empty 
    if all([new_key, new_value]): 
     item_data[new_key] = new_value 

print(item_data) 
# Output 
{'username': 'johndoe', 'campus': 'madison', 'email': '[email protected]'} 

Zurück Antwort: Löschen Sie die Elemente aus einem dict, deren Schlüssel oder Wert ist leer.

d = {'': '', 'username': 'johndoe', 'email': '[email protected]'} 

for k, v in d.items(): 
    if not any([k, v]): 
     del d[k] 

print(d) 
{'username': 'johndoe', 'email': '[email protected]'} 
+0

Dieser obere Teil löst aus: 'IndexError: Listenindex außerhalb des Bereichs ' – Modelesq

+0

@Modelesq, was ist der Inhalt von' post_dict'? – SparkAndShine

+0

'{'item_data [Benutzername]': ['johndoe'], 'item_data [email]': ['[email protected]'], 'item_data [Campus]': ['madison'], ...'und so weiter – Modelesq

1
for key, value in post_dict.items(): 

In Ihrem Code, den Sie auf post_dict iterieren. In der Zeile del post_dict[key] ändern Sie jedoch den Iterator, sodass eine inkonsistente Ansicht des Wörterbuchs auf for bereitgestellt wird. Es ist nicht gut, Schlüssel zu dem Wörterbuch hinzuzufügen oder zu löschen, das Sie gerade durchlaufen.

Dies ist das Ergebnis geben können Sie

post_dict = dict(request.POST) 
item_data = {} 

for key, value in post_dict.items(): 
    if value == "": 
     continue 
    if key == "": 
     continue 
    field = key.split('[')[1].replace(']', '') 
    item_data[field] = ''.join(value) 

print(item_data) 
+0

Ich bin sicher, dass der Aufruf von items() eine Kopie der Liste von Elementen zurückgibt, was bedeutet, dass das Löschen aus dem ursprünglichen Diktat die Iteration nicht wirklich beeinflusst ... Außer Sie sind richtig! Ich habe gerade einen einfachen Test geschrieben und es ändert definitiv das Diktat, das Sie durchlaufen. +1 –

+0

Irgendein Grund, warum es 'IndexError werfen würde: Listenindex außerhalb des Bereichs': \? – Modelesq

1

Vielleicht können Sie tun wollten, was Sie eine davon mit wollen:

dict_1 = {'': '', 'username': 'johndoe', 'email':'', } 

dict_2 = dict(x for x in dict_1.iteritems() if any(x)) 
print dict_2 # {'username': 'johndoe', 'email': ''} 

dict_3 = dict(x for x in dict_1.iteritems() if all(x)) 
print dict_3 # {'username': 'johndoe'} 
0

testen:

new_item_data={k:item_data[k] for k in item_data if item_data[k]} 

alle Schlüssel, die keine Werte werden entfernt.

Verwandte Themen