Python将列表元素按值分组为元组

2024-05-14 01:00:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个清单:

mylist = ['*', 'Drama', 'Film Noir', 'Mystery', 'Romance', '*', 'Dance', 'Drama', 'Musical', '*', 'Crime', 'Drama', '*', 'Action', 'Drama', 'Period', 'Western', '*', 'Adaptation', 'Based-on', 'Comedy', 'Romance', '*', 'Mystery', 'Thriller', '*', 'Comedy']

显然,元素“*”在列表中分隔组。如何将出现在“*”之间的元素分组?预期结果如下所示:

expected_list = [('Drama', 'Film Noir', 'Mystery', 'Romance'), ('Dance', 'Drama', 'Musical'), ('Crime', 'Drama'), ('Action', 'Drama', 'Period', 'Western'), ('Adaptation', 'Based-on', 'Comedy', 'Romance'), ('Mystery', 'Thriller'), ('Comedy')]

Tags: onactionperiodbasedfilmwesterncrimemusical
2条回答

使用^{}根据条目是否为*对条目进行分组,然后使用__ne__(不相等)方法或等效的lambda表达式保留那些不是*的部分:

>>> import itertools
>>> mylist = ['*', 'Drama', 'Film Noir', 'Mystery', 'Romance', '*', 'Dance', 'Drama', 'Musical', '*', 'Crime', 'Drama', '*', 'Action', 'Drama', 'Period', 'Western', '*', 'Adaptation', 'Based-on', 'Comedy', 'Romance', '*', 'Mystery', 'Thriller', '*', 'Comedy']
>>> [tuple(g) for k, g in itertools.groupby(mylist, key="*".__ne__) if k]
[('Drama', 'Film Noir', 'Mystery', 'Romance'),
 ('Dance', 'Drama', 'Musical'),
 ('Crime', 'Drama'),
 ('Action', 'Drama', 'Period', 'Western'),
 ('Adaptation', 'Based-on', 'Comedy', 'Romance'),
 ('Mystery', 'Thriller'),
 ('Comedy',)]

这是一个经典的use case for ^{}

from itertools import groupby

expected_list = [tuple(grp) for isstar, grp in groupby(mylist, key='*'.__eq__) if not isstar]

将您的输入分组为*和非*运行,将*组和tuple组放到非*

相关问题 更多 >