0

Есть ли способ фильтровать такой список?Список со списком со списком фильтров python

movies = [ 
    [["t", "transformers"],["g", "animation"],["d", "2005"]], 
    [["t", "ted"],["g", "comedy"],["d", "2008"]], 
    [["t", "starwars"],["g", "action"],["d", "2000"]] 
] 

, имеющий список фильтров, как этот

filter = [["g", "animation"], ["d", "2005"]] 

и получить

["transformers"] 

Я думаю, что не представляется возможным из-за структуры списка фильмов, но я не знаю, если Возможно, у мастера Python есть ответ.

спасибо, если у вас есть предложение об этом.

+2

я хотел бы начать с реструктурировать список фильмов, чтобы иметь список dicts – njzk2

+1

Или используйте 'NamedTuple', так как он выглядит как поля регулярные. –

+0

Конечно, вы можете выполнить проверку членства для каждого фильтра по всему списку фильмов. Конечно, это будет болезненно медленным для списка любого значительного размера. Вероятно, вы должны записать это в БД, а затем запросить его, поскольку это будет быстрее. –

ответ

1

что-то вроде этого:

movies = [ 
    [["t", "transformers"],["g", "animation"],["d", "2005"]], 
    [["t", "ted"],["g", "comedy"],["d", "2008"]], 
    [["t", "starwars"],["g", "action"],["d", "2000"]] 
] 

fil = [["g", "animation"], ["d", "2005"]] 


print [i[0][1] for i in movies if fil[0] in i and fil[1] in i] 

отпечатывается:

['transformers'] 
0

Первый шаг, реструктурировать в dicts (я переименовал filter в filtr, поскольку filter является встроенная функция):

movies = [dict(item) for item in movies] 
filtr = dict(filtr) 

Затем фильтр по вашему критерию:

filtered = [item for item in movies if all(item[k] == v for k,v in filtr.iteritems())] 

Здесь , вы выполняете цикл во всех фильмах, и вы ищете те, которые соответствуют всем элементам фильтра.

Затем напечатать все названия соответсвующей

print [item['t'] for item in filtered] 
# ['transformers'] 
1

Другой подход заключается в использовании объектно-ориентированного программирования (ОПП). Вы можете реализовать очень простой класс, который сэкономит вам много работы после.

class Movie: 

    def __init__(self, title, genre, year): 
     self.title = title 
     self.genre = genre 
     self.year = year 


    def filter(self, filter_): 
     """ filter_ here is a dict.""" 
     for feature, value in filter_.items(): 
      if getattr(self, feature) != value: 
       return False 
     return True 

    def __repr__(self): 
     return self.title 


movies = [ 
    Movie("transformers", "animation", 2005), 
    Movie("ted", "comedy", 2008), 
    Movie("starwars", "action", 2000) 
] 

filter_ = { "genre": "animation", "year": 2005} 

movies = [movie for movie in movies if movie.filter(filter_)] 

print(movies) 

это производят вывод:

['transformers'] 

А также вы можете делать такие вещи, как:

print(movies[0].title) 

, который будет производить вывод:

'transformers' 
+0

* Помимо *: Я думаю, вы имеете в виду [** жанр **] (http://en.wiktionary.org/wiki/ жанр), а не [** пол **] (http://en.wiktionary.org/wiki/gender). –

+0

Holy cr ... !!! Ты совершенно вон, мой плохой. Благодарю. –

+0

Я считаю, что в '' '' '' '' '' '' '' '' '' '' '' должна заменить переменную 'genre'' 'feature'. В противном случае, где вы сравниваете значение 'value' ключа' feature' в словаре 'filter_' с параметром' genre' объекта 'Movie'? –

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