2010-11-15 3 views
6

que tienen un diccionario con la siguiente estructura:Cómo filtrar dict para seleccionar solo claves mayores que un valor?

{5:"djdj", 6:"8899", 7:"998kdj"} 

La clave es de tipo int escrita a máquina y no se solucionó.

Ahora quiero que todos los elementos cuya clave es> = 6.

¿Hay manera fácil de hacer eso?

+0

¿Desea una 'list' donde todos los valores tengan una clave en el' dict' mayor que 6? ¿O quieres un 'dict' donde no hay claves menores a 6? – Johnsyweb

Respuesta

15

[v for k,v in mydict.items() if k >= 6]

+0

Una respuesta buena y concisa. –

+0

¿Es legal: {k, v para k, v en mydict.items() si k> = 6} –

+0

@Bin Chen: están agregando esa sintaxis (usando: en lugar de,) en Python 3, pero por ahora , no. http://www.python.org/dev/peps/pep-0274/ – bukzor

0

Se puede utilizar un lista por comprensión:

mydict = {5:"djdj", 6:"8899", 7:"998kdj"} 
print [k for k in mydict if k >= 6] # prints "[6, 7]" 
print dict([(k, mydict[k]) for k in mydict if k >= 6]) # prints "{6:"8899", 7:"998kdj"}" 
+0

En Python 3, puede hacer la comprensión del diccionario, por lo que el 'dict ([(k, mydict [k]) para k en mydict si k> = 6])' podría convertirse en '{k: mydict [k] para k en mydict si k> = 6]) '. Probablemente no sea útil para este caso, pero bueno, no obstante :-) –

1
[ mydict[k] for k in filter(lambda x : x > 6, mydict) ] 
+1

yuck, ¿por qué no 'en mydict si k> 6' en lugar de usar filter? –

0

Lista comprensión parece ser lo que usted busca, pero con una lista de elementos en contraposición a las teclas:

a = {5:"djdj", 6:"8899", 7:"998kdj"} 
[a[elem] for elem in a if elem >= 6] #should give you "['8866', '998kd']" 
8

¿Qué quiere decir con "elementos"?

Si quieres un dict de pares clave-valor con las teclas de ≥ 6, Python 2.7+ y 3.x apoyo comprensiones dict.

{ k: v for k, v in mydict.items() if k >= 6 } 

Usted puede conseguir esto en versiones anteriores de Python

dict((k, v) for k, v in mydict.items() if k >= 6) # Python 2.4+ 
dict([(k, v) for k, v in mydict.items() if k >= 6]) # Python 2.0+ 

mediante el uso de generadores de expresión o listas por comprensión.

Si desea una lista sólo de llaves,

[ k for k in mydict.keys() if k >= 6 ] 
filter(lambda k: k >= 6, mydict.keys()) 

Del mismo modo, si desea una lista de los únicos valores,

[ v for k, v in mydict.items() if k >= 6 ] 
[ mydict[k] for k in mydict.keys() if k >= 6 ] 
map(mydict.get, filter(lambda k: k >= 6, mydict.keys())) 
+1

Querías decir 'if', no' where', en tu lista de comprensiones. –

+1

D'oh. Obviamente. Demasiado SQL últimamente ... – ephemient

1

Si se conoce la clave más grande y no tienen ustedes claves que faltan también puede pasar directamente por el dictonario: [mydict[x] for x in range(6, largest_key+1)]. Esa sería la forma más eficiente.

+1

@bukzor: Entonces tienes muchas teclas faltantes, por lo que esto no se aplica. Por otro lado, considere un dict con 10^9 entradas donde desee x <100, que solo requiere 100 búsquedas, en lugar de 10^9 comparaciones. –

0

Para obtener un diccionario de inmediato: (funciona tanto en Python 2 y 3)

dict((k,v) for k,v in mydict.items() if k >= 6) 
6

Se puede hacer con filter también.

In [9]: data = {5:"djdj", 6:"8899", 7:"998kdj"} 

In [10]: dict(filter(lambda x: x[0] > 5, data.items())) 
Out[10]: {6: '8899', 7: '998kdj'} 
Cuestiones relacionadas