【问题标题】:Find physically closest element in a dict在字典中查找物理上最近的元素
【发布时间】:2020-05-20 00:38:44
【问题描述】:

我正在尝试在 python 字典中找到最接近给定元素的 physical 元素。比方说,这是我的字典: dict = {(1,10): "A", (11,23): "A", (24,2): "B", (25,5): "C"} 带有键等元组。

我想找到与该列表的最后一个元素(25,5): "C" 最接近的值为“A”的键。那将是(11,23): "A"。搜索应该在左侧和右侧都有效。 有没有办法做到这一点?不同的数据结构在这里会更好吗?

【问题讨论】:

  • 我认为数据结构不合适,但我不确定我是否非常清楚地理解您的规范。为什么不翻转键和值并对其进行排序,然后进行二等分呢?您能否提供有关您的用例的更多详细信息?谢谢。
  • “接近”是指欧几里得距离,即 dist((25,5), (11,23)) = sqrt(14^2 + 18^2) ?
  • 既然字典及其元素不是物理的,那么物理上最接近是什么意思?
  • 或者物理上接近,你的意思是(11, 23): "A"被写下来(在dict的定义中)更接近(25, 5): "C"而不是(1, 10): "A"
  • 我不是想找到按字母顺序最接近的值,这只是一个例子。我正在尝试做的事情:对于这个给定的元素,找到在这个字典中物理上最接近它的具有特定值 X 的元素。我所说的“身体上”的意思正是@vahlala 所说的。

标签: python dictionary


【解决方案1】:

这是基础 Python 中的一种方法:

d = {(1,10): "A", (11,23): "A", (24,2): "B", (25,5): "C"}

# the "target" you're trying to get close to
y = (25,5)

# the keys of the dict sorted by their closeness to y
d2 = sorted(d.keys(),
            key=lambda x: (x[0]-y[0])**2 + (x[1]-y[1])**2)
d2
# [(25, 5), (24, 2), (11, 23), (1, 10)]

# the first (closest) of these points with the label 'A' in the dict
[p for p in d2 if d[p]=='A'][0]
# (11, 23)

如果你的意思是“关闭”在字典中的顺序,你可以改为这样做

[p for p in d if d[p]=='A'][-1]
# (11,23)

但请注意,在 Python dicts 没有保留顺序。即使在 3.6+ 中,它们也不倾向于被视为有序列表,请考虑使用 list 代替,例如:

d = [[(1,10), "A"], [(11,23), "A"], [(24,2), "B"], [(25,5), "C"]]
[p[0] for p in d if p[1]=='A'][-1]
# (11,23)

【讨论】:

    【解决方案2】:

    这行得通:

    foo=sorted(dict.keys(), key=lambda x: np.linalg.norm(np.array(x)-np.array((25, 5))))
    [x for x in foo if dict[x]=="A"][0]
    

    【讨论】:

    • 你能解释一下,这到底是做什么的?我无法理解这里发生了什么。
    • @edrftg21 我假设“物理距离”是指“欧几里得距离”,第一行按与您最喜欢的键的距离对键进行排序,第二行提取值为“A”的键和最接近你最喜欢的键(所以[0] 给出了第一个元素,这意味着一个具有最低值的元素)。
    【解决方案3】:

    如果您只是在寻找距离最短的单点,则可以使用min

    import math
    t, t1 = (25,5), 'A'
    d = {(1,10): "A", (11,23): "A", (24,2): "B", (25,5): "C"}
    r = min(filter(lambda x:d[x] == t1, d), key=lambda x:math.dist(t, x))
    

    输出:

    (11, 23)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多