2013-11-17 4 views

ответ

2

Вы можете использовать список понимание, как этот

print [ticket for ticket in tickets if ticket['summary'] == issue['title']] 

или вы можете использовать filter как это

print filter(lambda ticket: ticket["summary"] == issue["title"], tickets) 

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

tickets = [{"summary" : "a"}, {"summary" : "a"}, {"summary" : "b"}] 
issue = {"title" : "a"} 
from timeit import timeit 
print timeit("[ticket for ticket in tickets if ticket['summary'] == issue['title']]", setup="from __main__ import tickets, issue") 
print timeit('filter(lambda ticket: ticket["summary"] == issue["title"], tickets)', setup="from __main__ import tickets, issue") 
print timeit("list(ticket for ticket in tickets if ticket['summary'] == issue['title'])", setup="from __main__ import tickets, issue") 

На моей машине я получил

0.347553014755 
0.691710948944 
1.10066413879 

Даже если цель состоит в том, чтобы получить только один элемент, который соответствует

tickets = [{"summary" : "a"}, {"summary" : "a"}, {"summary" : "b"}] 
issue = {"title" : "a"} 
setupString = "from __main__ import tickets, issue" 
from timeit import timeit 
print timeit("[ticket for ticket in tickets if ticket['summary'] == issue['title']][0]", setup=setupString) 
print timeit('filter(lambda ticket: ticket["summary"] == issue["title"], tickets)[0]', setup=setupString) 
print timeit("next(ticket for ticket in tickets if ticket['summary'] == issue['title'])", setup=setupString) 

выход на моей машине

0.369271993637 
0.717815876007 
0.557427883148 
+0

Ваш комментарий об относительной скорости неправильный. Тестовые списки с более чем тремя элементами. – Blender

2

длинный путь, но это будет искать через весь список:

for i in tickets: 
    if i['summary'] == issue['title']: 
     print('Found it!') 
    else: 
     print('Does not exist') 

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

def search(k, n): 
    for i in k: 
     if i['summary'] == n['title']: 
      return i 

results = search(tickets, issue) 
if not results: 
    print('No matching ticket found') 

Или, как это было предложено @Blender - использовать генератор:

result = next(t for t in tickets if t['summary'] == issue['title']) 
0

Кроме того, функциональный вариант:

filter (lambda dict: dict['summary'] == issue['title'], tickets) 

вернется все словари с условием.

Смежные вопросы