Considere el siguiente diccionario, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Quiero devolver la primera clave N: pares de valor de d (N <= 4 en este caso). ¿Cuál es el método más eficaz para hacer esto?
python
dictionary
Jason Strimpel
fuente
fuente
list(d.items())[:4]
. list () es la implementación subyacente para muchas de las respuestas.Respuestas:
No existen las "primeras n" teclas porque a
dict
no recuerda qué teclas se insertaron primero.Usted puede obtener cualquier pares de clave y valor n sin embargo:
Esto utiliza la implementación de
take
lasitertools
recetas :Véalo funcionando en línea: ideone
Actualización para Python 3.6
fuente
iteritems
debería ser reemplazado poritems
para la gente en Python 3take()
parte de la base del código de Python en algún lugar? ¿O es simplemente la función que definió en su respuesta aquí? Preguntando como si fuera parte del código base, no puedo encontrarlo / importarlo. :)Una forma muy eficaz de recuperar cualquier cosa es combinar las comprensiones de listas o diccionarios con la división. Si no necesita ordenar los elementos (solo quiere n pares aleatorios), puede usar una comprensión de diccionario como esta:
Generalmente, una comprensión como esta es siempre más rápida de ejecutar que el ciclo equivalente "para x en y". Además, al usar .keys () para hacer una lista de las claves del diccionario y dividir esa lista, evita 'tocar' las teclas innecesarias cuando crea el nuevo diccionario.
Si no necesita las claves (solo los valores), puede usar una lista de comprensión:
Si necesita los valores ordenados según sus claves, no hay mucho más problema:
o si también necesita las llaves:
fuente
Los
dict
s de Python no están ordenados, por lo que no tiene sentido pedir las "primeras N" claves.La
collections.OrderedDict
clase está disponible si eso es lo que necesita. Puede obtener de manera eficiente sus primeros cuatro elementos comoitertools.islice
le permite tomar perezosamente una porción de elementos de cualquier iterador. Si desea que el resultado sea reutilizable, deberá convertirlo en una lista o algo así:fuente
Básicamente, convierta la vista (dict_items) en un iterador y luego itere con next ().
fuente
No lo vi aquí. No se ordenará, sino que será sintácticamente más simple si solo necesita tomar algunos elementos de un diccionario.
fuente
TypeError: 'dict_items' object is not subscriptable
{key:value for key,value in stocks.items()[0:n]}
(existencias es el nombre de mi diccionario)Para obtener los N elementos principales de su diccionario de Python, se puede usar la siguiente línea de código:
En tu caso puedes cambiarlo a:
fuente
Consulte PEP 0265 sobre la clasificación de diccionarios. Luego use el código iterable mencionado anteriormente.
Si necesita más eficiencia en los pares clave-valor ordenados. Utilice una estructura de datos diferente. Es decir, uno que mantiene el orden ordenado y las asociaciones clave-valor.
P.ej
fuente
en py3, esto hará el truco
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
fuente
solo agrega una respuesta usando zip,
fuente
Esto depende de lo que sea "más eficiente" en su caso.
Si solo desea una muestra semi-aleatoria de un diccionario enorme
foo
, usefoo.iteritems()
y tome tantos valores como necesite, es una operación perezosa que evita la creación de una lista explícita de claves o elementos.Si necesita ordenar las claves primero, no hay forma de evitar usar algo como
keys = foo.keys(); keys.sort()
osorted(foo.iterkeys())
, tendrá que crear una lista explícita de claves. Entonces rebanar o iterar a través de primera Nkeys
.Por cierto, ¿por qué te preocupas por la forma "eficiente"? ¿Hiciste un perfil de tu programa? Si no lo hizo, utilice primero la forma obvia y fácil de entender . Es probable que funcione bastante bien sin convertirse en un cuello de botella.
fuente
Puede abordar esto de varias maneras. Si el orden es importante, puede hacer esto:
Si el orden no le preocupa, puede hacer esto:
fuente
value
lugar deitem
para mayor claridad.El diccionario no mantiene ningún orden, por lo que antes de elegir los N pares de valores clave principales, hagámoslo ordenar.
Ahora podemos hacer la recuperación de los elementos 'N' superiores :, usando la estructura del método como esta:
para obtener los 2 elementos superiores, simplemente use esta estructura:
fuente
Para Python 3 y superior, para seleccionar los primeros n pares
fuente
considerar un dictado
islice hará el truco :) espero que ayude!
fuente
Puede que esto no sea muy elegante, pero funciona para mí:
fuente
Probé algunas de las respuestas anteriores y noté que algunas de ellas dependen de la versión y no funcionan en la versión 3.7.
También observo que desde 3.6 todos los diccionarios están ordenados por la secuencia en la que se insertan los elementos.
A pesar de que los diccionarios se ordenaron desde 3.6, algunas de las declaraciones que espera que funcionen con estructuras ordenadas no parecen funcionar.
La respuesta a la pregunta de OP que mejor funcionó para mí.
fuente
lst = list(d.items())[:N]