从列表中获取键变化的索引,分组
我有一个列表,看起来是这样的:
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)