Come si recuperano gli elementi da un dizionario nell'ordine in cui sono inseriti?

StackOverflow https://stackoverflow.com/questions/60848

  •  09-06-2019
  •  | 
  •  

Domanda

È possibile recuperare elementi da un dizionario Python nell'ordine in cui sono stati inseriti?

È stato utile?

Soluzione

Il Pitone standard dict lo fa per impostazione predefinita se stai utilizzando CPython 3.6+ (o Python 3.7+ per qualsiasi altra implementazione di Python).

Nelle versioni precedenti di Python puoi usare collections.OrderedDict.

Altri suggerimenti

Le altre risposte sono corrette;non è possibile, ma potresti scriverlo tu stesso.Tuttavia, nel caso in cui non sei sicuro di come implementare effettivamente qualcosa di simile, ecco un'implementazione completa e funzionante dettata dalle sottoclassi che ho appena scritto e testato.(Nota che l'ordine dei valori passati al costruttore non è definito ma verrà prima dei valori passati in seguito e potresti sempre semplicemente non consentire che i dict ordinati vengano inizializzati con valori.)

class ordered_dict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self._order = self.keys()

    def __setitem__(self, key, value):
        dict.__setitem__(self, key, value)
        if key in self._order:
            self._order.remove(key)
        self._order.append(key)

    def __delitem__(self, key):
        dict.__delitem__(self, key)
        self._order.remove(key)

    def order(self):
        return self._order[:]

    def ordered_items(self):
        return [(key,self[key]) for key in self._order]


od = ordered_dict()
od["hello"] = "world"
od["goodbye"] = "cruel world"
print od.order()            # prints ['hello', 'goodbye']

del od["hello"]
od["monty"] = "python"
print od.order()            # prints ['goodbye', 'monty']

od["hello"] = "kitty"
print od.order()            # prints ['goodbye', 'monty', 'hello']

print od.ordered_items()
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]

Utilizza OrderedDict(), disponibile dalla versione 2.7

Giusto per curiosità:

from collections import OrderedDict
a = {}
b = OrderedDict()
c = OredredDict()

a['key1'] = 'value1'
a['key2'] = 'value2'

b['key1'] = 'value1'
b['key2'] = 'value2'

c['key2'] = 'value2'
c['key1'] = 'value1'

print a == b #True
print a == c #True
print b == c #False

Oppure rendi semplicemente la chiave una tupla con time.now() come primo campo nella tupla.

Quindi puoi recuperare le chiavi con dictname.keys(), sort e voilà!

Gerry

A partire da Python 3.7, il dict standard preserva l'ordine di inserimento.Dal documenti:

Modificato nella versione 3.7:È garantito che l'ordine del dizionario sia l'ordine di inserimento.Questo comportamento era un dettaglio dell'implementazione di CPython dalla 3.6.

Quindi, dovresti essere in grado di scorrere normalmente il dizionario o utilizzare popitem().

Non puoi farlo con la classe base dict: è ordinata per hash.Potresti creare il tuo dizionario che è in realtà un elenco di coppie chiave, valore o qualcosa del genere, che verrebbe ordinato.

Ho già usato StableDict con buon successo.

http://pypi.python.org/pypi/StableDict/0.2

Oppure utilizzare una qualsiasi delle implementazioni per il PEP-372 descritto Qui, come il modulo ottetto dal pythonutils.

Ho utilizzato con successo l'implementazione di pocoo.org, è facile come sostituire il tuo

my_dict={}
my_dict["foo"]="bar"

con

my_dict=odict.odict()
my_dict["foo"]="bar"

e richiedono solo questa vita

Non è possibile a meno che non si memorizzino le chiavi in ​​un elenco separato per farvi riferimento in seguito.

Quello che puoi fare è inserire i valori con una chiave che rappresenta l'ordine immesso e quindi chiamare sorted() sugli articoli.

>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
...     print v
... 
Bob
Sally
Joe
>>> 

se non hai bisogno della funzionalità dict e devi solo restituire le tuple nell'ordine in cui le hai inserite, una coda non funzionerebbe meglio?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top