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
语句中有类型变量替换功能。否则,您在哪里将过滤器
字典中功能
键的值
与电影
对象的流派
参数进行比较?