Y a-t-il un moyen, en python, pour moi de créer une liste où chaque élément est une référence à un élément dans un dictionnaire? De cette façon, je peux maintenir une liste triée, tout en étant capable de changer la valeur en l'indexant dans le dictionnaire.
d = {
'price_one': 12,
'price_two': 13,
'price_three': 5
}
sorted_list = [ptr_to_price_three, ptr_to_price_one, ptr_to_price_two]
print(sorted_list) # [5, 12, 13]
d['price_one'] = 1
sorted_list.sort() # [ptr_to_price_one, ptr_to_price_three, ptr_to_price_two]
print(sorted_list) # [1, 5, 13]
3 Réponses :
Essayez ceci:
d = {
'price_one': 12,
'price_two': 13,
'price_three': 5
}
def get_sorted(d):
sorted_list = sorted(list(d.values()))
return tuple(zip(sorted_list, d[key] for key in sorted_list))
# end get_sorted
print(get_sorted(d))
d['price_one'] = 1
print(get_sorted(d))
Notez que vous devrez appeler get_sorted (d) à chaque fois ...
De plus, il renvoie un tuple de paires (clé, valeur) triées avec leurs clés. Si vous voulez accéder à la troisième valeur, dites get_sorted (d) [2] [1] . Le 2 pour la troisième paire, le 1 pour la valeur.
Je suis presque sûr que cela ne fonctionnera pas. Lorsque cette ligne est exécutée d ['price_one'] = 1 , la valeur ne changera pas dans la liste
Je l'ai changé donc c'est une fonction à la place. Ce n'est peut-être pas joli mais ça marche.
Aucun problème. Si cela fonctionne, vous pouvez aider d'autres programmeurs comme vous à obtenir cette réponse lorsqu'ils voient cette question en appuyant sur la coche pour la marquer comme réponse correcte. Continuez votre excellent travail: D
Vous avez mentionné Python en général. Vous pouvez utiliser un dataframe:
import pandas as pd
d = {
'price_one': 12,
'price_two': 13,
'price_three': 5
}
df = pd.DataFrame(list(d.values()), columns=['val'], index=d.keys())
df.loc['price_one'] = 1
df.sort_values(['val'])
Sorties:
Tirer des pandas (et un framework incroyablement lourd) pour cela semble un peu trop. C'est bien si vous utilisez de toute façon pandas , mais je ne l'utiliserais pas comme solution de choix en général.
Les clés du dictionnaire sont des références à des entrées particulières d'un dictionnaire.
Une fonction pour générer une liste de clés de dictionnaire dans l'ordre des valeurs d'entrée du dictionnaire est:
ks = sorted_keys(d) smallest = d[ ks[0] ]
afin d'accéder au plus petit prix de votre exemple: p >
def sorted_keys(d):
return sorted(d.keys(), key=lambda k: d[k])
Le problème est que vous devez recalculer votre commande sur toute insertion, modification ou suppression du dictionnaire. Celles-ci seraient difficiles à intercepter, donc mieux vaut garder le contrôle et recalculer la commande juste au moment où vous voulez l'utiliser.
Vous pouvez enterrer tout cela dans une class SortedDict (dict) qui remplace la fonction get d'un dictionnaire.
Vous ne savez pas quel est le cas d'utilisation réel ici, mais serait-il résolu par
OrderedDict? docs.python.org/3/library/…@JacobIRR Intéressant. Il semble que cela pourrait fonctionner pour moi. Si je devais changer une valeur dans le dictionnaire, est-ce que l'ordre changerait également?
OrderedDict (et dict normal sur python 3.7+ / ipython 3.6+) sont classés par insertion - la seule façon de les garder ordonnés est de les créer a-new:
d = dict (d.items ())après avoir changé quelque chose - ce qui n'est pas vraiment bon. Pourquoi avez-vous besoin de cela et de quoi? Quelle est la taille du dict? Pourquoi ne pas créer une fonctiondef get_ordered_items (d): return sorted (d.values ())?@PatrickArtner Il semble que j'aie besoin de recourir de toute façon après chaque modification, donc c'est peut-être la meilleure option
Essayez-vous de maintenir efficacement un conteneur trié? Parce qu'alors, vous devriez simplement utiliser des conteneurs triés
@ juanpa.arrivillaga Le but est de maintenir un conteneur trié où les éléments peuvent être modifiés par clé (et cette recherche de clé est O (logn) ou plus rapide)
@bpgeck vous devriez vraiment regarder cette bibliothèque alors. Je soupçonne que ce sera beaucoup plus rapide que tout ce que vous déployez vous-même. Ils ont une performance
SortedDictqui s'est avérée assez rapide, d'autant plus qu'elle surpasse diverses implémentations de bibliothèques C ++ en utilisant les suspects habituels (par exemple des arbres rouge-noir) et qu'elle est écrite en python pur < / i>. Consultez les comparaisons de performances . Notez que pour__getitem__, il surpasse toutes ces bibliothèques C / C ++ sophistiquées!