【问题标题】:Get the subdictionary based on range根据范围获取子字典
【发布时间】:2010-09-13 07:49:57
【问题描述】:

我有一本以坐标对作为键的字典:即:

d = {(15,21): "value1", (7,45): "value2", (500,321): "value3",...}

现在我需要返回键在一定范围内的元素的子字典: 例如: (6:16, 20:46) 的范围应返回以下字典: d = {(15,21): "Value1", (7,45): value2} 如果该范围内没有其他元素。 是否有任何预定义的字典功能可以做到这一点? ..或者你有什么其他建议吗?

谢谢

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    这是一种方法

    d = {(15,21): "value1", (7,45): "value2", (500,321): "value3"}
    x1, x2, y1, y2 = 6, 16, 20, 46 
    dict((k,v) for k, v in d.iteritems() if x1<k[0]<x2 and y1<k[1]<y2)
    

    Python 2.7 添加了字典解析。最后一行变得更具可读性:

    {k: v for k, v in d.iteritems() if x1<k[0]<x2 and y1<k[1]<y2}
    

    【讨论】:

    • 如果你使用生成器表达式而不是列表推导,效率会更高。 dict((k,v) ... x&lt;k[1]&lt;y) 而不是 dict([(k,v) ... x&lt;k[1]&lt;y])
    • 不应该是and 而不是or 吗?假设 OP 希望这两个值都在给定范围内。
    • 谢谢!这看起来很整洁,但是我不确定效率..我的字典最多有 25.000 个元素,我必须在搜索距离内寻找每个元素的最近邻居,所以我必须搜索中的每个元素dict..你能扩展一下使用生成器的想法吗?
    • 要么我误解了 OP 的问题,要么这个答案很混乱。在列表理解的第一次外部迭代中,x=6y=16。然后你开始遍历字典和k[0]=15。您的测试询问 15(X 坐标)是否介于 6(X 坐标)和 16(Y 坐标)之间。 15 是否在 6 和 20(两个 X 坐标)之间不是相关问题吗?只是想知道 - 我可能误解了 OP 的问题。
    • @FM:您正确理解了这个问题:xmin,ymin,xmax,ymax = 14,20,16,22 d1 = dict([(k,v) for k, v in d.items () 如果 xmin
    【解决方案2】:

    @Matej - 如果您正在寻找最近的邻居来搜索大型数据集,为什么不看看scipy.spatial.KDTree。非常快速的 kNN 搜索功能。您可以轻松地将数组转换为 KD-Tree,并使用 KDTree.query()KDTree.query_ball_point() 语法对其进行查询。

    【讨论】:

      【解决方案3】:

      不,没有预定义的函数可以做到这一点。您可能可以使用列表推导。

      items = [ value for key, value in d.items() if key[0] in range(6,16) and key[1] in range(20, 46) ]
      

      【讨论】:

        【解决方案4】:

        看起来你想要范围查询。对于大而复杂的字典,这可能效率不高。

        你可能想看看这个,但你可能需要修改一些数据

        http://packages.python.org/lupyne/examples.html

        【讨论】:

          【解决方案5】:

          Python 字典是哈希表,不适合对大型数据集进行高效的范围查询。对于有效的范围查询,您需要将数据存储在某种结构中,以保持键的排序。如果您的数据集是静态的(或至少不经常更改),那么使用二进制搜索的排序列表将起作用。否则,你真的应该使用B-Tree 或类似的结构。

          【讨论】:

            【解决方案6】:

            在 Python 2.7 中,我们有字典推导,这使得这种事情变得容易做和容易阅读:

            d = {(15,21): "value1", (7,45): "value2", (500,321): "value3",...}
            d_in_range = {k: v for k, v in d if 6 < k[0] < 20 and 16 < k[1] < 46} # dictionary comprehension.
            

            【讨论】:

            • python2.7 以后支持字典推导。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-27
            • 2019-11-09
            • 2019-03-12
            相关资源
            最近更新 更多