Получить субдискретизатор на основе диапазона - PullRequest
3 голосов
/ 13 сентября 2010

У меня есть словарь, в котором в качестве ключей используются пары координат: то есть:

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

Теперь мне нужно вернуть под словарь элементов, где ключи находятся в определенном диапазоне: например: диапазон (6:16, 20:46) должен возвращать следующий словарь: d = {(15,21): "Value1", (7,45): value2} если в этом диапазоне не было другого элемента. Есть ли предопределенная функция словаря для этого? ... или у вас есть другие предложения?

Thx

Ответы [ 6 ]

5 голосов
/ 13 сентября 2010

Вот один из способов сделать это

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 голос
/ 12 августа 2013

@ Matej - Если вы ищете ближайшего соседа, который ищет большие наборы данных, почему бы вам не взглянуть на scipy.spatial.KDTree. Очень быстрый поиск в KNN. Вы можете легко превратить массив в KD-дерево и запросить его, используя синтаксис KDTree.query() или KDTree.query_ball_point().

0 голосов
/ 14 сентября 2010

Словари Python - это хеш-таблицы, которые не подходят для запросов с эффективным диапазоном для больших наборов данных. Для эффективных диапазонов запросов вам необходимо хранить данные в некоторой структуре, в которой ключи отсортированы. Если ваш набор данных является статическим (или, по крайней мере, меняется редко), то будет работать отсортированный список с двоичным поиском. В противном случае вам следует использовать B-Tree или аналогичную структуру.

0 голосов
/ 13 сентября 2010

В 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.
0 голосов
/ 13 сентября 2010

похоже, что вы хотите диапазон запросов.для больших и сложных диктов это может быть неэффективно.

вы можете взглянуть на это, вам, возможно, придется изменить некоторые из ваших данных, хотя

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

0 голосов
/ 13 сентября 2010

Нет, для этого не существует предопределенной функции. Вы могли бы, вероятно, использовать понимание списка.

items = [ value for key, value in d.items() if key[0] in range(6,16) and key[1] in range(20, 46) ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...