Python 包含过滤器列表的理解列表

Python 包含过滤器列表的理解列表,python,list,multidimensional-array,compression,list-comprehension,Python,List,Multidimensional Array,Compression,List Comprehension,有没有办法过滤这样的列表 movies = [ [["t", "transformers"],["g", "animation"],["d", "2005"]], [["t", "ted"],["g", "comedy"],["d", "2008"]], [["t", "starwars"],["g", "action"],["d", "2000"]] ] 有这样一个过滤器列表 filter = [["g", "animation"], ["d", "2005"]] 接收

有没有办法过滤这样的列表

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向导是否有答案


如果您对此有任何建议,谢谢。

第一步,在dicts中重新构造(我将
过滤器
重命名为
过滤器
,因为
过滤器
是一个内置函数):

然后,根据您的标准进行过滤:

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']
大概是这样的:

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']

另一种方法是使用面向对象编程(OPP)。您可以实现一个非常简单的类,它将在以后为您节省大量的工作

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']
'transformers'
你也可以做一些事情,比如:

print(movies[0].title)
这将产生输出:

['transformers']
'transformers'

首先,我将重新构造电影列表,使其具有一个dictor列表,或者使用一个名为tuple的
字段,因为它看起来像是常规字段。当然,您可以对整个电影列表中的每个过滤器进行成员资格检查。当然,对于任何规模巨大的名单来说,这都是非常缓慢的。你可能应该把它写进数据库,然后查询到数据库,因为这样会更快。是的,你所说的都是正确的,但是是关于这个具体的问题。。。谢谢阿拉塞德:我想你的意思是,不是。我相信你应该在
过滤器
函数的
if
语句中有
类型
变量替换
功能。否则,您在哪里将
过滤器
字典中
功能
键的
电影
对象的
流派
参数进行比较?