2016-06-27 7 views
0

eine Sammlung gegeben, die bestellt und verkeilt (wie OrderedDict oder SortedContainers SortedDict) ich folgendes tun:Wie bekomme ich den Index und Wert für einen Schlüssel von SortedDict effizient?

d['first'] = 'hi' 
d['second'] = 'there' 
d['third'] = 'world' 
(ix, value) = d.get_index_and_value('second') 
assert d.iloc[ix + 1] == 'third' 
# or list(d.keys())[ix + 1] with OrderedDict 

aber ich kann nicht eine effiziente Art und Weise zu sehen bekommen sowohl den Index und den Wert gegeben einen Schlüssel ((ix, value) = d.get_index_and_value('second')).

Ist dies mit SortedDict oder einem anderen Container möglich?

In der Praxis sind meine Schlüssel eine sortierbare Sammlung (Daten), wenn das bedeutet, dass es einen besseren Container gibt, den ich verwenden könnte.

+0

Scheint die Antwort ist nein ... Ich grub in den SortedDict-Quellcode und es speichert eine sortierte Liste von Schlüsseln und ein 'dict', also glaube ich nicht, dass es einen effizienten Weg gibt, es mit diesen Daten zu machen. Ich habe versucht, tuplesof '(index, value)' in einem OrderedDict zu speichern, und das funktioniert gut. – danio

Antwort

1

Sie können das index Methode von keys:

ix, value = d.keys().index('second'), d['second'] 

diese

(1, 'there') 

zurückkehren Wenn Sie sich nicht wiederholen möchten, können Sie diese Funktion machen, oder erweitern OrderedDict um dies als eine Methode einzuschließen:

def get_index_and_value(d, key): 
    return d.keys().index(key), d[key] 

print(get_index_and_value(d, 'second') 
+0

Danke, aber ich denke Index() ist O (n). Da der Lookup bereits gefunden wurde, hoffte ich, dass es effizienter sein könnte. – danio

Verwandte Themen