Python字典理解过滤

2024-09-27 18:08:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典列表,例如:

movies = [
{
"name": "The Help",
"imdb": 8.0,
"category": "Drama"
},
{
"name": "The Choice",
"imdb": 6.2,
"category": "Romance"
},
{
"name": "Colonia",
"imdb": 7.4,
"category": "Romance"
},
{
"name": "Love",
"imdb": 6.0,
"category": "Romance"
},
{
"name": "Bride Wars",
"imdb": 5.4,
"category": "Romance"
},
{
"name": "AlphaJet",
"imdb": 3.2,
"category": "War"
},
{
"name": "Ringing Crime",
"imdb": 4.0,
"category": "Crime"
}
]

我想用IMDB>;5.5筛选它们:

我尝试以下代码:

^{pr2}$

以及输出:

[{'name': 'The Help', 'imdb': 8.0, 'category': 'Drama'},
 {'name': 'The Choice', 'imdb': 6.2, 'category': 'Romance'},
 {'name': 'Colonia', 'imdb': 7.4, 'category': 'Romance'},
 {'name': 'Love', 'imdb': 6.0, 'category': 'Romance'},
 {},
 {},
 {}]

当IMDB低于5.5时,它返回一个空字典。有什么想法吗?谢谢您!在


Tags: thename列表字典helpmoviesimdbcategory
3条回答

使用列表理解的另一种方法是使用Python builtins中的filter函数。它接受一个函数和一个iterable,并返回一个“filter object”,该对象只保留通过函数时返回True的项。在

在这种情况下,它将是:

list(filter(lambda x:x["imdb"]>5.5, movies))

我将list()包含在所有内容中,以将filter对象转换为可以使用的列表。如果您想了解更多关于filter内置的信息,可以阅读here。在

过滤字典列表不需要字典理解。在

您只需使用基于字典值的条件的列表理解:

res = [d for d in movies if d['imdb'] > 5.5]

按照编写代码的方式,字典理解在i['imdb'] <= 5.5的情况下生成一个空字典。在

其他的答案已经提供了更好的替代方法,但是让我们看看你是怎么做的,看看发生了什么。在

如果我从你的代码中删除一些内容,我会得到:

[{} for i in movies}]

看看这一点,就应该弄清楚为什么要为每部电影创建一部词典。您在字典中确实有一个if语句,但是因为它在字典中,所以它不会改变它是否被创建。在

要按照您之前的方式执行此操作,您基本上需要检查两次,使第一次检查不相关:

^{pr2}$

可以简化为

[
   { k:v for (k,v) in i.items()} for i in movies if i.get("imdb") > 5.5
]

现在,既然我们没有更改项目,只需:

[
   i for i in movies if i.get("imdb") > 5.5
]

相关问题 更多 >

    热门问题