2016-02-22 7 views
0

Проведя утро, глядя на похожие вопросы, мне нужно немного помочь закончить мой фильтр в списке словарей.Фильтрация списка словарей по списку подстрок

У меня есть список словарей, возвращаемых из вызова API, который я хочу фильтровать, чтобы возвращать списки, где значение «name» содержит определенные подстроки.

Следующий код работает наполовину. Он возвращает только имена job.names, которые содержат конечную подстроку в списке: («-upload»).

def filter(): 
    list_of_dicts = server.get_jobs() 
    foo = ["-cb", "-audit", "-upload"] 
    for f in foo: 
     filtered = [d for d in list_of_dicts if f in d["name"] 
    return render_template("testing.html", jobs=filtered) 

Для полноты этого передается:

{% for job in jobs %} 
    <p>Job: {{job.name}}</p> 
{% endfor %} 

Я попытался инициализацией пустого списка перед циклом и добавлением отфильтрованного переменного к нему, но я всегда получаю ошибку = «объект генератор» не имеет атрибута «элементов»:

def filter(): 
    list_of_dicts = server.get_jobs() 
    foo = ["-cb", "-audit", "-upload"] 
    for f in foo: 
     result = [] 
     filtered = [d for d in list_of_dicts if f in d["name"] 
     result.append(filtered) 
    return render_template("testing.html", jobs=result) 
+1

Вместо создания 'filtered' в цикле:' отфильтрованный = [D для г в list_of_dicts если (е в d ["name"] для f в foo] ' – khelwood

+0

Это работает, однако, как есть задание в list_of_dicts с каждой из подстрок (job1-cb, job1-audit, job1-upload), я получаю повторяющиеся значения для каждый результат (job1-cb x3, job1-audit x 3, job1-upload x3). Есть идеи? – Gillespie

+0

@ Gillespie, если вы не хотите повторений, сделайте это 'set' вместо понимания' list'. Просто измените его на 'filter = {d for d ...}' – dwanderson

ответ

1

это потому, что вы перезаписать свой список в каждой итерации цикла следующей

for f in foo: 
    filtered = [d for d in list_of_dicts if f in d["name"] 

Так фильтруется имеет результат только последнего f что '-upload' Вам нужно сделать

filtered = list() 
for f in foo: 
    filtered.extend([d for d in list_of_dicts if f in d["name"]) 
Смежные вопросы