【发布时间】:2017-03-10 21:32:28
【问题描述】:
我正在研究 Python 中的列表理解,并且难以将我的代码压缩为单个列表理解语句。
我正在编写一个函数来搜索如下所示的电影词典列表:
movies = [
{
"name": "Usual Suspects",
"imdb": 7.0,
"category": "Thriller"
},
{
"name": "Hitman",
"imdb": 6.3,
"category": "Action"
},
{
"name": "Dark Knight",
"imdb": 9.0,
"category": "Adventure"
}
]
我正在尝试编写一个函数,该函数接受电影名称的输入,检查 imdb 分数,如果分数 > 5.5 则返回 True,但如果分数不符合此条件则返回 false。
用传统代码编写,我是这样完成的:
def good_movie(movie_name):
for m in movies: #for each item in movies...
if m["name"] == movie_name: #see if movie_name == "name", if it does...
if m["imdb"] > 5.5: # See if the movie's score is greater than 5.5...
return "True" # If it is, return "true"
else: #otherwise
return "False" #return false
我已经能够在列表理解中编写此代码以返回 true,但如果我还想在电影不符合正确评分标准时返回 false,则无法使函数正常工作。
有效的简短版本是:
def good_movie(movie_name):
return ["True" for m in movies if m["name"] == movie_name if m["imdb"] > 5.5]
但是,如果 movie_name 不满足此处列出的两个 if 语句,我希望能够返回 False 值。我已经尝试了几种不同的方法,但无法弄清楚如何使其工作。
这样的东西不起作用:
def good_movie(movie_name):
return ["True" if m["imdb"] > 5.5 and if m["name"] == movie_name else "False" for m in movies]
我认为在 if 语句之间添加“and”可能会有所帮助(否则,它会将 if 语句视为独立的,而不是连接的)。
我已经来回处理这个问题很多次了,但是任何人都可以提供的任何帮助都将帮助我更好地理解这些类型的列表推导在未来是如何工作的。
感谢您的帮助!
编辑:感谢大家的回复。这是我关于堆栈溢出的第一篇文章,我已经被我的小请求所获得的响应量所震撼。我知道列表理解不是在实际应用程序中解决这个问题的最佳方法,我只是在学习列表理解的过程中,想看看如何在普通 python 中解决这个问题,而不导入熊猫,等等。再次感谢所有贡献的人!
【问题讨论】:
-
你为什么使用
"True"和"False"字符串而不是Python的True和False布尔值? -
这不是列表理解的情况。列表推导式不仅仅是编写循环的一种时髦方式;它们用于构建列表,您不想在此处的任何地方构建列表。
-
@user2357112 确实如此,但生成器表达式相似,它们用于循环。
标签: python list function if-statement