从密钥更改的列表中获取索引,groupby

时间:2011-09-30 20:30:31

标签: python list indexing group-by

我有一个如下所示的列表:

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 个答案:

答案 0 :(得分:3)

[i for i in range(len(myList)-1) if myList[i] != myList[i+1]]

在Python 2中,将range替换为xrange

答案 1 :(得分:3)

只需使用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)

答案 2 :(得分:1)

>>> x0 = myList[0]
... for i, x in enumerate(myList):
...     if x != x0:
...         print i - 1
...         x0 = x
3
6