![](/img/trans.png)
[英]More pythonic way to create list of dicts from dict where list elements are dict of form `{v:[k1, k2, k3]}`
[英]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'}]
我会这样做,但不知道这是否是一种更 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.