Как мне найти вложенный словарь с учетом конкретных ограничений? - PullRequest
1 голос
/ 02 февраля 2012

Надеясь, что кто-то может предложить простой способ поиска большого вложенного словаря очень специфическим способом.

Пример изречения:

foo = {"item1" : ((0.1, 0.03 , 0.7), (0.01, 0.01, 0.02), (0.3, 0.4, 0.05)), "item2" : ((0.5, 0.2 , 0.01), (0.1, 0.3, 1.0), (0.4, 0.2, 0.8))}

Я хочу найти выше, используя дваограничения.Позиция кортежа и диапазона для поиска и возврата любых результатов сопоставления с указанием их позиции индекса в списке и соответствующего им ключа dict, где значение ключа представляет собой список истинных позиций индекса.

пример: поискПозиция 2 кортежей, использующая диапазон (0,7-1,0), и я хочу вернуть ответ:

{"item1" : (0), "item2" : (1, 2)}

Я не уверен, как запустить поиск с использованием ограничений и отформатировать результаты так, как я хочу,Любые предложения были бы хорошими?Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Вы можете определить свою собственную функцию:

def special_search(my_dict, pos, min, max):
    result = {}
    for item, tuples in my_dict.items():
        matches = []
        for i, t in enumerate(tuples):
            if min <= t[pos] <= max:
                matches.append(i)
        if matches:
            result[item] = tuple(matches)
    return result

Используя ваш пример:

>>> foo = {"item1": ((0.1, 0.03 , 0.7), (0.01, 0.01, 0.02), (0.3, 0.4, 0.05)),
...        "item2": ((0.5, 0.2 , 0.01), (0.1, 0.3, 1.0), (0.4, 0.2, 0.8))}
>>> special_search(foo, 2, 0.7, 1.0)
{'item2': (1, 2), 'item1': (0,)}
1 голос
/ 03 февраля 2012

Вы также можете настроить свой тест, используя функцию:

from operator import itemgetter

test = lambda t: 0.7 <= itemgetter(2)(t) <= 1.0
results = dict((k, tuple(n for n,v in enumerate(t) if test(v))) for k,t in foo.items())

print(results)
# {'item2': (1, 2), 'item1': (0,)}
0 голосов
/ 03 февраля 2012

Более короткая и быстрая реализация алгоритма julio.alegria (+1):

def search(d, pos, min, max):
    searchspace = set(range(min(max))
    answer = {}
    for k, v in d.iteritems():
        answer[k] = tuple([i for i,tuple in enumerate(v) if tuple[pos] in searchspace])
    return dict(( (k, d[k]) for k in in d if d[k]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...