Considérez le dictionnaire suivant, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Je veux retourner la première clé N: paires de valeurs de d (N <= 4 dans ce cas). Quelle est la méthode la plus efficace pour y parvenir?
python
dictionary
Jason Strimpel
la source
la source
list(d.items())[:4]
. list () est l'implémentation sous-jacente de nombreuses réponses.Réponses:
Les «premières n» clés
dict
n'existent pas car a ne se souvient pas quelles clés ont été insérées en premier.Vous pouvez obtenir toutes les paires clé-valeur n cependant:
Celui - ci utilise la mise en œuvre
take
desitertools
recettes :Regardez-le fonctionner en ligne: ideone
Mise à jour pour Python 3.6
la source
iteritems
devrait être remplacé paritems
pour les gens sur Python 3take()
partie de la base de code python quelque part? Ou est-ce uniquement la fonction que vous avez définie dans votre réponse ici? En demandant comme si cela faisait partie de la base de code, je ne suis pas en mesure de le trouver / de l'importer. :)Un moyen très efficace de récupérer quoi que ce soit est de combiner des compréhensions de liste ou de dictionnaire avec le découpage. Si vous n'avez pas besoin de commander les éléments (vous voulez juste n paires aléatoires), vous pouvez utiliser une compréhension de dictionnaire comme celle-ci:
En général, une telle compréhension est toujours plus rapide à exécuter que l'équivalent de la boucle «for x in y». De plus, en utilisant .keys () pour créer une liste des clés du dictionnaire et en découpant cette liste, vous évitez de «toucher» les touches inutiles lorsque vous créez le nouveau dictionnaire.
Si vous n'avez pas besoin des clés (uniquement les valeurs), vous pouvez utiliser une compréhension de liste:
Si vous avez besoin que les valeurs soient triées en fonction de leurs clés, ce n'est pas beaucoup plus de problèmes:
ou si vous avez également besoin des clés:
la source
Python
dict
s ne sont pas ordonnés, il est donc inutile de demander les «premières N» clés.Le
collections.OrderedDict
cours est disponible si c'est ce dont vous avez besoin. Vous pouvez efficacement obtenir ses quatre premiers éléments commeitertools.islice
vous permet de prendre paresseusement une tranche d'éléments de n'importe quel itérateur. Si vous voulez que le résultat soit réutilisable, vous devez le convertir en une liste ou quelque chose comme ceci:la source
En gros, transformez la vue (dict_items) en itérateur, puis itérez-la avec next ().
la source
Je ne l'ai pas vu ici. Ne sera pas ordonné mais syntaxiquement le plus simple si vous avez juste besoin de prendre quelques éléments d'un dictionnaire.
la source
TypeError: 'dict_items' object is not subscriptable
{key:value for key,value in stocks.items()[0:n]}
(stocks est le nom de mon dictionnaire)Pour obtenir les N premiers éléments de votre dictionnaire python, vous pouvez utiliser la ligne de code suivante:
Dans votre cas, vous pouvez le changer en:
la source
Voir PEP 0265 sur le tri des dictionnaires. Ensuite, utilisez le code itératif mentionné ci-dessus.
Si vous avez besoin de plus d'efficacité dans les paires clé-valeur triées. Utilisez une structure de données différente. Autrement dit, celui qui maintient l'ordre trié et les associations clé-valeur.
Par exemple
la source
dans py3, cela fera l'affaire
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
la source
ajoutez simplement une réponse en utilisant zip,
la source
Cela dépend de ce qui est «le plus efficace» dans votre cas.
Si vous voulez juste un échantillon semi-aléatoire d'un énorme dictionnaire
foo
, utilisezfoo.iteritems()
et prenez autant de valeurs que vous le souhaitez, c'est une opération paresseuse qui évite la création d'une liste explicite de clés ou d'éléments.Si vous devez d'abord trier les clés, il n'y a aucun moyen d'utiliser quelque chose comme
keys = foo.keys(); keys.sort()
ousorted(foo.iterkeys())
, vous devrez créer une liste explicite de clés. Puis couper ou itérer à travers le premier Nkeys
.BTW pourquoi vous souciez-vous de la manière «efficace»? Avez-vous profilé votre programme? Si vous ne l'avez pas fait, utilisez d' abord la méthode évidente et facile à comprendre . Il y a de fortes chances que cela se passe plutôt bien sans devenir un goulot d'étranglement.
la source
Vous pouvez aborder cela de plusieurs façons. Si l'ordre est important, vous pouvez le faire:
Si la commande n'est pas un problème, vous pouvez le faire:
la source
value
plutôt queitem
pour plus de clarté.Le dictionnaire ne maintient aucun ordre, donc avant de choisir les N meilleures paires de valeurs clés, faisons le tri.
Maintenant, nous pouvons faire la récupération des éléments 'N' supérieurs :, en utilisant la structure de méthode comme ceci:
pour obtenir les 2 premiers éléments, utilisez simplement cette structure:
la source
Pour Python 3 et supérieur, pour sélectionner les n premières paires
la source
considérer un dict
islice fera l'affaire :) j'espère que cela vous aidera!
la source
Cela n'est peut-être pas très élégant, mais fonctionne pour moi:
la source
J'ai essayé quelques-unes des réponses ci-dessus et je note que certaines d'entre elles dépendent de la version et ne fonctionnent pas dans la version 3.7.
Je note également que depuis 3.6 tous les dictionnaires sont classés selon l'ordre dans lequel les éléments sont insérés.
Bien que les dictionnaires soient commandés depuis la version 3.6, certaines des instructions que vous prévoyez de travailler avec des structures ordonnées ne semblent pas fonctionner.
La réponse à la question OP qui a le mieux fonctionné pour moi.
la source
lst = list(d.items())[:N]
Approche inhabituelle, car elle donne une intense complexité temporelle O (N).
la source