删除列表列表中的内部列表
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']
我正在使用此代码从词典列表中提取流派。
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']