我正在使用此代码从字典列表中提取类型。
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']
答案 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']