繁体   English   中英

基于不能包含字符串列表中的字符串的字典值从字典列表中过滤对象的更多 pythonic 方法

[英]More pythonic way to filter objects from a list of dicts based on a dict value that must not contain a string from a list of strings

由于我来自 Java,我想知道是否有更 pythonic 的方法来实现以下逻辑:

movies = [{'original_title': 'Star Wars'}, {'original_title': 'Avengers'}, {'original_title': 'After Love'}]
blacklist = ['Star', 'Love']

filtered_movies = []
for movie in movies:
    blacklisted = False
    for item in blacklist:
        if item in movie['original_title']:
            blacklisted = True
            break
    if not blacklisted:
        filtered_movies.append(movie)

return filtered_movies

filtered_movies然后只包含项目{'original_title': 'Avengers'}

您可以通过列表理解来做到这一点:

filtered_movies = [movie for movie in movies 
                   if not any(
                      item in movie['original_title']
                      for item in blacklist
                   )]

例如:

>>> movies = [{'original_title': 'Star Wars'}, {'original_title': 'Avengers'}, {'original_title': 'After Love'}]
>>> blacklist = ['Star', 'Love']
>>> filtered_movies = [movie for movie in movies
... if not any(item in movie['original_title'] for item in blacklist)]
>>> filtered_movies
[{'original_title': 'Avengers'}]

这是执行此类过滤操作的一种非常规范的方式; 内置的any (此处使用)和all方法对此特别有用。

我会这样做,但不知道这是否是一种更 pythonic 的方法。

movies = [
    {'original_title': 'Star Wars'},
    {'original_title': 'Avengers'},
    {'original_title': 'After Love'},
]
blacklist = ['Star', 'Love']

filtered_movies = []
for movie in movies:
    if any(word in movie['original_title'] for word in blacklist):
        continue
    filtered_movies.append(movie)

print(filtered_movies)

在这里你 go 使用过滤器和 lambda function 并设置

>>> list(filter(lambda x: len(set(blacklist) & set(x["original_title"].split())) == 0, movies))
[{'original_title': 'Avengers'}]

如果不允许拆分,则:

>>> list(filter(lambda x: len([1 for y in blacklist if y in x["original_title"]])==0, movies))
[{'original_title': 'Avengers'}]
>>> list(filter(lambda x: not any(1 for y in blacklist if y in x["original_title"]), movies))
[{'original_title': 'Avengers'}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM