在字典中查找整数最近邻

Bas*_*asj 5 python algorithm dictionary nearest-neighbor

我有一个dict需要整数键的:

a = {}
a[1] = 100
a[55] = 101
a[127] = 102
Run Code Online (Sandbox Code Playgroud)

我希望在询问时能够选择最近的邻居:

a[20] # should return a[1] = 100
a[58] # should return a[55] = 101
a[167] # should return a[127] = 102
Run Code Online (Sandbox Code Playgroud)

有没有一种Python式的方法可以做到这一点?(我想这可以通过循环所有字典来完成,但这可能不是最优雅的解决方案?)


双索引(也是整数)同样的问题:

 b[90, 1] = 100, b[90, 55] = 101, b[90, 127] = 102
 b[70, 1] = 40, b[70, 45] = 41, b[70, 107] = 42
Run Code Online (Sandbox Code Playgroud)

我希望能够得到 b[73, 40] = b[70, 45] = 41即二维平面中的最近邻。

Tim*_*nin 2

与此类似的东西:

class CustomDict(dict):
    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            closest_key = min(self.keys(), key=lambda x: abs(x - key))
            return dict.__getitem__(self, closest_key)
Run Code Online (Sandbox Code Playgroud)

或这个:

class CustomDict(dict):
    def __getitem__(self, key):
        if key in self:
            return dict.__getitem__(self, key)
        else:
            closest_key = min(self.keys(), key=lambda x: abs(x - key))
            return dict.__getitem__(self, closest_key)
Run Code Online (Sandbox Code Playgroud)

两者都给出了这个结果:

a = CustomDict()
a[1] = 100
a[55] = 101
a[127] = 102

print a[20] # prints 100
print a[58] # prints 101
print a[167] # prints 102
Run Code Online (Sandbox Code Playgroud)

对于双索引版本:

class CustomDoubleDict(dict):
    def __getitem__(self, key):
        if key in self:
            return dict.__getitem__(self, key)
        else:
            closest_key = min(self.keys(), key=lambda c: (c[0] - key[0]) ** 2 + (c[1] - key[1]) ** 2)
            return dict.__getitem__(self, closest_key)


b = CustomDoubleDict()
b[90, 1] = 100
b[90, 55] = 101
b[90, 127] = 102
b[70, 1] = 40
b[70, 45] = 41
b[70, 107] = 42

print b[73, 40]  # prints 41
print b[70, 45]  # prints 41
Run Code Online (Sandbox Code Playgroud)