Элемент списка группы Python по значению в кортежи - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть этот список:

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

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Это классический вариант использования для itertools.groupby:

from itertools import groupby

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

, который группирует ваши входы в прогоны *, а не - *, сбрасывает * групп, и tuple с не * групп.

0 голосов
/ 21 февраля 2019

Используйте itertools.groupby, чтобы сгруппировать записи по тому, являются ли они * или нет, а затем просто сохранить те части, которые не *, используя метод __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',)]
...