2014-10-20 3 views
0

У меня есть словарь с 3 элементами: URL, скорость, онлайн.Самый быстрый способ поиска Словарь Пункт Встреча 2 Отдельные критерии

URL = text string (using it as the key) 
Speed = integer 
Online = True/False 

Мне нужно получить ключ словаря с наименьшим числом целых чисел, где Online = True.

Скорость очень важна для этого поиска в сценарии.

Какой самый быстрый способ получить ключ?

Цикл - это то, что я делаю в настоящее время. Есть что-то быстрее?

dict = {'url1.com': [1, False], 'url2.com': [5, True], 
       'url3.net': [2, False], 'url4.org': [3, True], 
       'url5.net': [2, True]} 

min = 99999 
for key, first in dict.items(): 
    online = first[1] 
    if online == True: 
     speed = first[0] 
     print speed 

     if speed < min: 
      current_key = key 
      min = speed 

print current_key 

ответ

0

Если вы хотите, чтобы оптимизировать скорость вам нужно использовать что-то другое, чем Dict для хранения данных. Когда вы вычисляете значения для «скорости», вы можете сохранить самое низкое значение в переменной, которая будет использоваться в конце. Затем вам не нужно проходить каждый элемент в dict снова, чтобы выяснить, что является самым низким значением.

3
print min((x for x in data_dict.items() if x[-1][-1]),key=lambda x:x[-1]) 

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

1

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

У вас были некоторые посторонние задания и вещи.

min = 99999 
for key, first in dict.items(): 
    if first[1]: 
     if first[0] < min: 
      min = first[0] 
      current_key = key 

print current_key 
+0

Спасибо. На данный момент этот тест был самым быстрым. – Sage

+0

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

+0

на самом деле это выглядит довольно быстро даже при гораздо больших наборах данных (+1) –

0
for k, v in sorted(d.items(), key=lambda (x,y): y[0], reverse=True): # for py3.x do list(d.items()) 
    if all(v): 
     print k 
     break 
Смежные вопросы