根据范围获取子字典

时间:2010-09-13 07:49:58

标签: python dictionary

我有一个字典,其坐标对作为键:即:

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

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

THX

6 个答案:

答案 0 :(得分:5)

这是一种方法

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}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

不,没有预定义的功能来做到这一点。你可以使用列表理解。

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

在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.

答案 5 :(得分:0)

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