2016-01-13 15 views
5

Ho cercato di eliminare più dizionari in un elenco, ma posso eliminarne solo uno alla volta.Elimina più dizionari in un elenco

Di seguito è riportato il codice principale su cui sto lavorando. Records è la lista di dizionari. Voglio eliminare i dizionari che contengono 0.

Records = [{'Name':'Kelvin','Price': 0},{'Name': 'Michael','Price':10}] 

voglio cancellare dizionari con prezzi di 0

def deleteUnsold(self): 
    for d in records: 
     for key, value in d.items(): 
      if d['Price'] == 0: 
       records.remove(d) 
+1

Che cosa significa il ciclo for 'per la chiave, il valore d'd.Items()' fare? – MrHug

+0

ha lo scopo di scorrere le chiavi e i valori nei dizionari @MrHug – MrKay

+0

Posso vederlo, ma non usi né "chiave" né "valore" nelle viscere di "for-loop", rendendo il ciclo abbastanza inutile;) – MrHug

risposta

11

Utilizzare un list comprehension con una condizione if

>>> Records = [{'Name':'Kelvin','Price': 0},{'Name': 'Michael','Price':10}] 
>>> [i for i in Records if i['Price'] != 0] 
[{'Price': 10, 'Name': 'Michael'}] 

Partenza if/else in Python's list comprehension? per ulteriori informazioni sull'utilizzo di un condizionale all'interno di una lista comprensione.


Si noti che [come detto below] si può anche lasciare fuori controllo per il valore 0. Tuttavia questo funziona anche se Price è None, quindi è possibile utilizzare la prima alternativa, se non si è sicuri del tipo di dati del valore di Price

>>> [i for i in Records if i['Price']] 
[{'Price': 10, 'Name': 'Michael'}] 
+2

Probabilmente si può omettere la parte 'non è 0' (e avrei usato'! = 0', invece, poiché mi fido dell'uguaglianza più di quanto ritenga l'internamento di interi). – TigerhawkT3

+0

@ TigerhawkT3 In un momento –

+0

Non sono molto pratico con la comprensione delle liste. Come faccio quindi ad aggiungere l'istruzione delete? – MrKay

2

È possibile utilizzare filter:

print filter(lambda x:x['Price']!=0,Records) 
+0

Perché questo downvote? Non funziona? –

+3

È considerato "meno" pitonico e la comprensione delle liste dovrebbe essere preferita. Fai anche attenzione che il filtro in python 3 restituisca un iteratore e non una lista. – Evariste

0

Ok , in generale, non devi rimuovere elementi da una lista per la quale stai iterando, perché probabilmente ti mancheranno alcuni elementi della lista.

Ora, riguardo ad un'altra risposta qui, sì, funzionano, ma in senso stretto non stanno rimuovendo/eliminando elementi dalla lista: stanno creando un nuovo elenco e sostituendo la vecchia variabile con una nuova lista.

cosa si potrebbe fare:

for d in list(records): 
    if d['Price'] == 0: 
     records.remove(d) 

for d in reversed(records): 
    if d['Price'] == 0: 
     records.remove(d) 

for idx in range(len(records)-1,-1,-1): 
    if records[idx]['Price'] == 0: 
     records.pop(idx) 

mi piace questo, però:

for d in records[::-1]: 
    if d['Price'] == 0: 
     records.remove(d) 
+0

Fare riferimento a queste due risposte cancellate http://i.stack.imgur.com/anHx0.png per una discussione completa della soluzione. Grazie –