删除列表列表中的内部列表

Remove inner list in list of lists

我正在使用此代码从词典列表中提取流派。

dict=[{'genres': ['Thriller'], 'year': '2014'}, {'genres': ['Animation','Drama'], 'year': '2014'}]
test=[i["genres"] for i in dict]
test
[['Thriller'], ['Animation', 'Drama']]

我想删除内部列表并创建单个列表。

Expected output:['Thriller', 'Animation', 'Drama']

您可以使用嵌套列表理解来执行此操作:

>>> list_of_dicts =[{'genres': ['Thriller'], 'year': '2014'}, {'genres': ['Animation','Drama'], 'year': '2014'}]
>>> [genre for d in list_of_dicts for genre in d['genres']]
['Thriller', 'Animation', 'Drama']

如果您有可能重复,请在此基础上调用 set

>>> set(genre for d in list_of_dicts for genre in d['genres'])
{'Animation', 'Drama', 'Thriller'}

从@mgilson 的回答中得到提示,如果你想让它与没有 genres 键的字典一起工作,你可以做

>>> list_of_dicts =[{'genres': ['Thriller'], 'year': '2014'}, {"year": '2014'}]
>>> set(genre for d in list_of_dicts for genre in d.get('genres', []))
{'Thriller'}

我会使用 itertools

首先,编写一个生成流派列表的生成器(一个接一个)。

import itertools
dicts = [{'genres': ['Thriller'], 'year': '2014'}, {'genres': ['Animation','Drama'], 'year': '2014'}]
genres_nested = (dct.get('genres', ()) for dct in dicts)

这个特定的生成器是 "forgiving" -- 它将允许列表中没有 'genres' 字段的字典。

然后,用 itertools.chain.from_iterable 展平嵌套结构(您可以使用嵌套推导式——但我一直发现 itertools.chain.from_iterable 更易于阅读……):

genres = itertools.chain.from_iterable(genres_nested)

如果你需要一个列表,你总是可以在结果 "chain" 对象上调用 list...

print(list(genres))

作为一个附带好处,除了最后这个阶段,我们所做的一切都是完全懒惰的——没有中间列表浪费我们计算机上的存储空间。是啊!

列表理解是你的朋友

>>> dicts=[{'genres': ['Thriller'], 'year': '2014'}, {'genres': ['Animation','Drama'], 'year': '2014'}]
>>> [gen for d in dicts for gen in d['genres']]
['Thriller', 'Animation', 'Drama']