En primer lugar, no debe usar la palabra clave dict
como nombre de variable, ya que contamina el espacio de nombres y le impide hacer referencia a la clase dict
en el ámbito actual o incrustado.
d = {}
d["joe"] = 20
d["bill"] = 20.232
d["tom"] = 0.0
# create an intermediate generator that is fed into dict constructor
# via a list comprehension
# this is more efficient that the pure "[...]" variant
d2 = dict(((k, v) for (k, v) in d.iteritems() if v > 0))
print d2
# {'bill': 20.232, 'joe': 20}
Como alternativa, puede crear el generador y el repetidor directamente sobre él. Esto se parece más a un "filtro", porque el generador solo hace referencia a los valores en el dict original en lugar de hacer una copia de subconjunto; y por lo tanto es más eficiente que crear un nuevo diccionario:
filtered = ((k, v) for (k, v) in d.iteritems() if v > 0)
print filtered
# <generator object <genexpr> at 0x034A18F0>
for k, v in filtered:
print k, v
# bill 20.232
# joe 20
Interlocutor está buscando devolver un diccionario, esto solo devuelve las claves del diccionario. Y es simplemente menos eficiente/Pythonic que la respuesta de @kindall –
podría ser esto: 'd = dict (filter (lambda x: x [1]> 0.0, d.items()))' – Jeffery