def new_dict(old_dict):
n = old_dict.copy()
n.pop('mykey1',None)
return n
new_list_of_dict = map(new_dict,list_of_dict)
o
new_list_of_dict = [ new_dict(d) for d in list_of_dict ]
Piuttosto che usare del
, ho optato per dict.pop
dal pop
sopprimerà l'KeyError
se la chiave non esiste.
Se si desidera ottenere solo determinate chiavi, questo diventa un po 'più semplice.
from operator import itemgetter
tuple_keys = ('key1','key2','key3')
get_keys = itemgetter(*tuple_keys)
new_dict_list = [ dict(zip(tuple_keys,get_keys(d)) for d in old_dict_list ]
che solleva KeyError
se le chiavi non sono nella vecchia dict
Oppure:
new_dict_list = [ dict((k,d.get(k,None)) for k in tuple_keys) for d in old_dict_list ]
che sarà anche aggiungere key:None
se key
non è nel vecchio dict. Se non si desidera che None
, si potrebbe fare:
new_dict_list = [ dict((k,d[k]) for k in tuple_keys if k in d) for d in old_dict_list ]
A seconda di quale percentuale del dizionario che stai con/senza e la dimensione dei dizionari, questo potrebbe essere leggermente più veloce rispetto alla soluzione da @ MartijnPieters.
E sostituire il bozzetto dict con 'dict ((k, v) per k, v in d.iteritems() se k! = 'Mykey1')', se siete su python2. 6 o più vecchio. – mgilson
@mgilson Se la mia condizione è che k sia in una specifica tupla, è corretto farlo: {dict ((k, v) per k, v in d.iteritems() se k in mytuple)} yeah? Perché quando lo faccio, ottengo: tipo inattaccabile: 'dict' – dublintech
@dublintech: stai usando la sintassi sbagliata; è parentesi quadre intorno al tutto, non parentesi graffe: '[dict ((k, v) per k, v in d.iteritems() se k in mytuple) per d in mylist]'. L'espressione 'k in mytuple' va bene. –