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

时间:2015-02-11 04:59:00

标签: python list-comprehension

我正在使用此代码从字典列表中提取类型。

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']

3 个答案:

答案 0 :(得分:2)

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

>>> 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密钥的dicts,你可以做

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

答案 1 :(得分:2)

我会使用itertools

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

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

这个特殊的生成器是“宽容的” - 它允许列表中没有'genres'字段的dicts。

然后,使用itertools.chain.from_iterable展平嵌套结构(您可以使用嵌套理解 - 但我总是发现itertools.chain.from_iterable更容易阅读...):

genres = itertools.chain.from_iterable(genres_nested)

如果您需要一个列表,可以随时在生成的“链”对象上调用list ...

print(list(genres))

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

答案 2 :(得分:1)

list comprehension是你的朋友

In[21]:dicts=[{'genres': ['Thriller'], 'year': '2014'}, {'genres': ['Animation','Drama'], 'year': '2014'}]
In[22]: [gen for d in dicts for gen in d['genres'] ]
Out[22]: ['Thriller', 'Animation', 'Drama']