Domanda

Sto cercando di ordinare un dict in base alla sua chiave e restituire un iteratore ai valori all'interno di un metodo iter sovrascritto in una classe. Esiste un modo migliore ed efficiente per farlo che creare un nuovo elenco, inserendolo nell'elenco mentre ordino le chiavi?

È stato utile?

Soluzione

Che ne dici di qualcosa del genere:

def itersorted(d):
    for key in sorted(d):
        yield d[key]

Altri suggerimenti

L'approccio di gran lunga più semplice, e quasi sicuramente il più veloce, è qualcosa del tipo:

def sorted_dict(d):
    keys = d.keys()
    keys.sort()
    for key in keys:
        yield d[key]

Non puoi ordinare senza recuperare tutte le chiavi. Recuperare tutte le chiavi in ??un elenco e quindi ordinare tale elenco è il modo più efficace per farlo; l'ordinamento degli elenchi è molto veloce e il recupero dell'elenco di chiavi in ??questo modo è il più veloce possibile. È quindi possibile creare un nuovo elenco di valori o restituire i valori come nell'esempio. Tieni presente che non puoi modificare il dict se stai iterando su di esso (la prossima iterazione fallirebbe) quindi se vuoi modificare il dict prima di aver finito con il risultato di sort_dict (), fallo restituire un elenco .

def sortedDict(dictobj):
    return (value for key, value in sorted(dictobj.iteritems()))

Questo creerà un singolo elenco intermedio, il metodo 'ordinati ()' restituisce un vero elenco. Ma almeno è solo uno.

Supponendo che si desideri un ordinamento predefinito, è possibile utilizzare sort (list) o list.sort (). Se si desidera la propria logica di ordinamento, gli elenchi Python supportano la possibilità di ordinare in base a una funzione passata. Ad esempio, il seguente sarebbe un modo per ordinare i numeri dal meno al più grande (il comportamento predefinito) utilizzando una funzione.

def compareTwo(a, b):
  if a > b:
    return 1
  if a == b:
    return 0
  if a < b:
    return -1

List.Sort(compareTwo)
print a

Questo approccio è concettualmente un po 'più pulito rispetto alla creazione manuale di un nuovo elenco e all'aggiunta di nuovi valori e consente di controllare la logica di ordinamento.

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