Python list comprehension:返回值匹配多个if语句,否则返回其他值

时间:2017-03-10 21:32:29

标签: python list function if-statement

我正在使用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分数,如果分数>则返回True。 5.5,但如果分数不符合此标准则返回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。我已经尝试了几种不同的方法,但无法弄清楚如何使其发挥作用。

类似这样的事情' T work:

    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语句之间会有所帮助(否则,它会将if语句视为独立的,而不是连接的)。

我曾经多次来回使用过,但是任何人都可以提供的帮助可以帮助我更好地理解这些列表理解在将来是如何运作的。

感谢您的帮助!

编辑:谢谢大家的回复。这是我关于堆栈溢出的第一篇文章,我已经因为我的小请求得到的回复而感到震惊。我理解列表理解不是在现实世界的应用程序中解决这个问题的最佳方法,我只是在学习列表理解的过程中,并想看看如何在普通的python中解决这个问题,而不导入pandas,等再次感谢所有贡献的人!

4 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。这只是使用了几个快捷方式。我认为import * as viewer from './core/viewer'; import * as viewerData from './core/viewer-data'; ... 可能是获得满足条件的迭代的第一个元素的最好方法。

next

答案 1 :(得分:0)

index = next(index for (index, d) in enumerate(lst) if d["name"] == movie_name)

结合根据索引查找得分,你很好!

答案 2 :(得分:0)

如果您计划对分数进行多次评估,那么您应该重新考虑您的数据结构。如果你曾经只是遍历那个词典列表那么它可能会这样做,但你最终想要评估多个电影。如果您多次为同一个电影列表调用evaluate,这比每次循环遍历列表更有效:

scores = {d['name']: d['imdb'] for d in movies}

def evaluate(name):
    return scores[name] > 5.5

它首先使用dictcomp构建名称到分数的映射,然后该函数是微不足道的。

答案 3 :(得分:0)

我知道你想要遍历列表,但也许你可以考虑其他方式。在您的情况下,熊猫将更容易使用。

function getJobsResult()
{
  require "connection.php";
  $mysql_query = "SELECT * FROM Job"];

  $result = mysqli_query($conn,$mysql_query) or die('This is the die query error');

//check the result


  if(mysqli_num_rows($result)>0)
  {
    while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
        {

        $JobId = $row["job_id"];
        $date =$row["date"];
        $number =$row["number"];
        $street =$row["street"];
        $town = $row["town"];
        $city = $row["city"];
        $postcode = $row["postcode"];
        $eta=$row["eta"];

       $longlist .= $JobId.",".$number.",".$street.",".$date.",".$town.",".$city.",".$postcode.",".$eta."**";

    }

     return $longlist;

    }
    mysqli_close($conn);

}

输出:

    import pandas as pd

    movies = [
     {
     "name": "Usual Suspects", 
     "imdb": 7.0,
     "category": "Thriller"
     },
     {
     "name": "Hitman",
     "imdb": 6.3,
     "category": "Action"
     },
     {
     "name": "Dark Knight",
     "imdb": 9.0,
     "category": "Adventure"
     }
     ]

     movie_pd = pd.DataFrame(movies)
     # find movies that have more than 7.5 scores in imbd.
     movie_pd['good_movie'] = movie_pd[ movie_pd['imdb'] > 7.5].name