Ich versuche einen Weg zu finden, den nächsten Schlüssel zu einer Zeichenkette innerhalb eines Diktons zu finden. Beispiel:Finden Sie den nächsten Schlüssel in einem Dikton mit String?
data = {'1a': 'This is 1a', '1d': 'This is 1d', '1f': 'This is 1f', '1e': 'This is 1e'}
find_nearest(data, '1b')
#This would return key '1a'
Ich habe andere Beispiele gefunden, aber die meisten beschäftigen sich mit Zahlen. Beispiel:
data[num] if num in data else data[min(data.keys(), key=lambda k: abs(k-num))]
ich in der Lage war, einen Code zu finden, die vielversprechend aussah:
from sortedcontainers import SortedDict
sd = SortedDict((key, value) for key, value in data)
# Bisect for the index of the desired key.
index = sd.bisect(200)
# With that index, lookup the key.
key = sd.iloc[index]
# You can also look ahead or behind to find the nearest key.
behind = sd.iloc[index - 1]
ahead = sd.iloc[index + 1]
Also das habe ich versucht, hier ist mein Code:
from sortedcontainers import SortedDict
data = {'1a': 'This is 1a', '1d': 'This is 1d', '1f': 'This is 1f', '1e': 'This is 1e'}
sd = SortedDict((key,value) for key,value in data.items())
index = sd.bisect('1b')
key = sd.iloc[index]
print(key)
Aber wenn ich diesen Code ausführen es gibt zurück:
1d #Instead of '1a'
Ich habe tr auf jeden Fall, um den Code zum Laufen zu bringen, aber ich finde es nicht richtig. Kennt jemand einen schnellen und effizienten Weg dies zu erreichen?
Die Halbierung Funktion tut nur bisect_right, die Ihnen den richtigen nächsten Wert und nicht die nächste gibt. – Schore
Sie müssen definieren, was * am nächsten * innerhalb Ihrer Anforderung bedeutet? ... wie..was, wenn es '1a' und' 1c' gäbe, was würden Sie als nah betrachten? .. und welches werden Sie auswählen? –