Получить индекс из списка, где ключ меняется, по группам - PullRequest
1 голос
/ 01 октября 2011

У меня есть список, который выглядит следующим образом:

myList = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3]

Что я хочу сделать, это записать индекс, где элементы в списке изменяют значение.Так что для моего списка выше это будет 3, 6 *.

Я знаю, что при использовании groupby вот так:

[len(list(group)) for key, group in groupby(myList)]

приведет к:

[4, 3, 3]

, но чтоЯ хочу, это индекс, где группа начинается / заканчивается, а не просто количество элементов в группах.Я знаю, что мог бы начать суммировать число каждой успешной группы-1, чтобы получить индекс, но подумал, что может быть более чистый способ сделать это.

Мысли оценены.

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

Просто используйте enumerate для создания индексов вместе со списком.

from operator import itemgetter
from itertools import groupby
myList = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3]

[next(group) for key, group in groupby(enumerate(myList), key=itemgetter(1))]
# [(0, 1), (4, 2), (7, 3)]

Это дает пары (start_index, value) для каждой группы.

Если вы действительно просто хотите [3, 6], вы можете использовать

[tuple(group)[-1][0] for key, group in 
        groupby(enumerate(myList), key=itemgetter(1))][:-1]

или

indexes = (next(group)[0] - 1 for key, group in
                groupby(enumerate(myList), key=itemgetter(1)))

next(indexes)
indexes = list(indexes)
3 голосов
/ 01 октября 2011
[i for i in range(len(myList)-1) if myList[i] != myList[i+1]]

В Python 2 замените range на xrange.

1 голос
/ 01 октября 2011
>>> x0 = myList[0]
... for i, x in enumerate(myList):
...     if x != x0:
...         print i - 1
...         x0 = x
3
6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...