2011-12-08 39 views
15

Tengo un diccionario de claves de cadena y valores flotantes.La mejor manera de filtrar un diccionario en Python

mydict = {} 
mydict["joe"] = 20 
mydict["bill"] = 20.232 
mydict["tom"] = 0.0 

Quiero filtrar el diccionario para incluir solo pares que tienen un valor mayor que cero.

En C#, me gustaría hacer algo como esto:

dict = dict.Where(r=>r.Value > 0); 

¿Cuál es el código equivalente en Python?

Respuesta

40
d = dict((k, v) for k, v in d.iteritems() if v > 0) 

En Python 2.7 y arriba, no hay sintaxis más agradable para esto:

d = {k: v for k, v in d.items() if v > 0} 

Tenga en cuenta que esto no es estrictamente un filtro, ya que hace crear un nuevo diccionario.

0

Asumiendo que su diccionario original es d1 podría utilizar algo como:

d2 = dict((k, v) for k, v in d1.items() if v > 0) 

Por cierto, tenga en cuenta que dict ya está reservado en Python.

0

El constructor dict puede tomar una secuencia de (key,value) pares, y el método de un dict iteritems produce una secuencia de (key,value) pares. Son dos grandes sabores que saben muy bien juntos.

newDict = dict([item for item in oldDict.iteritems() if item[1] > 0]) 
1

tratar

y = filter(lambda x:dict[x] > 0.0,dict.keys()) 

la lambda es la alimentación de las teclas de la dict, y compara los valores de la dict para cada tecla, en contra de los criterios, volviendo de nuevo las teclas aceptables.

+1

Interlocutor está buscando devolver un diccionario, esto solo devuelve las claves del diccionario. Y es simplemente menos eficiente/Pythonic que la respuesta de @kindall –

+1

podría ser esto: 'd = dict (filter (lambda x: x [1]> 0.0, d.items()))' – Jeffery

0
foo = {} 
foo["joe"] = 20 
foo["bill"] = 20.232 
foo["tom"] = 0.0 

bar = dict((k,v) for k,v in foo.items() if v>0) 

dict es una palabra clave en Python, así que lo reemplazó con foo.

0

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 
Cuestiones relacionadas