Est-ce qu'un Python peut dicter avec des entiers comme les clés sont naturellement triées?
Si je crée un Python dict qui utilise des nombres entiers comme les clés, puis-je supposer qu'une itération sur la dict permettra de récupérer les éléments dans l'ordre en fonction de la valeur de clé?
va
my_dict = {}
for x in range(0,100):
my_dict[x] = str(x)
for item in my_dict.items():
print item
toujours l'impression de la liste dans l'ordre de la valeur de la clé?
source d'informationauteur user3067927
Vous devez vous connecter pour publier un commentaire.
En bref, pas. Je parie que vous avez noté que l'utilisation des dictionnaires les valeurs de hachage de touches comme index dans un tableau, et depuis ints de hachage à leurs propres valeurs, vous déduit que les valeurs insérées de commande par clé si leurs clés sont des nombres entiers. Alors que les 2 premières parties de cette déclaration est vraie, l'inférence n'est pas, même en tant que sans-papiers, des effets secondaires. Le dict clés sont dérivés des hachages des clés, mais ne sont pas les tables de hachage. Cela signifie que, même avec entier touches, vous pouvez toujours sortir de la commande de soupape depuis 2 valeurs pourraient entrer en collision dans le même emplacement (ou même "ordre" de hachage valeurs dérivées) et ainsi d'insérer les clés de l'ordre dans le dict.
Fondamentalement, il pense que l'index à l'intérieur de la matrice de stockage du dict être certains nombre de bits d'ordre bas à partir de la clé de hachage. Juste parce qu'un nombre est plus grand que l'autre ne signifie pas qu'une valeur construite, il est tronqué faible de bits d'ordre va être plus grand, ou même différents.
Non, Python dictionnaires ne sont pas inhérentes à la commande, indépendamment des valeurs de clé. Si vous avez besoin de commander, s'en tenir à des tableaux ou des listes, ou mieux encore - découvrez
pandas
ce qui permettra une capacité similaire à des dictionnaires pour l'appel par valeur de la clé, ainsi que de nombreuses autres fonctionnalités puissantes (http://pandas.pydata.org/pandas-docs/stable/10min.html).Non, vous ne pouvez pas. Toujours de tri si vous souhaitez effectuer une itération d'une manière ordonnée.
Je ne le pense pas. Vous avez à faire usage de
collections.OrderedDict
afin de s'assurer de la commande. Toutefois, cela permettra de trier les entrées dans l'ordre où ils ont été ajoutés.Python dictionnaires ne sont pas ordonnés de manière significative; ils sont les tables de hachage.
Python vient avec les collections.OrderedDict, mais il trie dans l'ordre d'insertion, et non pas de l'ordre de la clé.
Voici deux de type dictionnaire modules de trier par touches:
https://pypi.python.org/pypi/treap/
https://pypi.python.org/pypi/red-black-tree-mod/
Certains disent que treaps sont en moyenne plus vite que les arbres rouge-noir mais les arbres rouge-noir ont un écart type faible dans les durées de fonctionnement. D'autres s'interrogent sur ce, si, dans mes tests, l'ancien s'est avéré vrai.
Les deux treaps et les arbres rouge-noir faire presque tout en O(logn) de temps, mais gardent leurs clés afin constamment. Python dictionnaires sont en O(1) pour la plupart des opérations. Cependant, l'obtention de toutes les clés dans l'ordre O(n) pour treaps et les arbres rouge-noir, alors qu'il est en O(nlogn) pour les dictionnaires.
Quand devez-vous utiliser?
ou rouge-noir arbre.
vous êtes probablement mieux avec list_ = liste(dict_); list_.sort()
ou quelque chose, vous êtes probablement mieux avec OrderedDict.
HTH