从列表中获取键变化的索引,分组

1 投票
3 回答
2240 浏览
提问于 2025-04-17 03:27

我有一个列表,看起来是这样的:

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 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

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

在Python 2中,把range换成xrange

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

这样可以得到每组的 (起始索引, 值) 的配对。

如果你真的只想要 [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)

撰写回答