Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从键更改的列表中获取索引,groupby_Python_List_Indexing_Group By - Fatal编程技术网

Python 从键更改的列表中获取索引,groupby

Python 从键更改的列表中获取索引,groupby,python,list,indexing,group-by,Python,List,Indexing,Group By,我有一个如下列表: myList = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3] [len(list(group)) for key, group in groupby(myList)] 我要做的是记录列表中的项目更改值所在的索引。所以我上面的列表是3,6 我知道像这样使用groupby: myList = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3] [len(list(group)) for key, group in groupby(myList)]

我有一个如下列表:

myList = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3]
[len(list(group)) for key, group in groupby(myList)]
我要做的是记录列表中的项目更改值所在的索引。所以我上面的列表是3,6

我知道像这样使用groupby:

myList = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3]
[len(list(group)) for key, group in groupby(myList)]
将导致:

[4, 3, 3]
但我想要的是一个组开始/结束的索引,而不是组中项目的数量。我知道我可以开始将每个成功的组计数相加,得到索引,但我认为可能有更干净的方法

我很感激你的想法

[i for i in range(len(myList)-1) if myList[i] != myList[i+1]]
在Python 2中,将
range
替换为
xrange


在Python2中,将
range
替换为
xrange

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


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



这很好,因为它同时提供了变更索引和值如果我只想返回索引值而不是键,我需要修改哪些代码?或者这在分组方式中是不可能的?请原谅我对该主题的无知,您的第二个答案符合我的需要,只需提供索引。@user965586无需原谅;很高兴我能帮上忙。这个解决方案很可爱,但太复杂了,没有用处。这项任务确实很简单,因此应该有一个简单的解决办法。任何时候我使用
itemgetter
我都需要它。任何看你代码的人都很难弄明白这行代码的作用。这一点很明显,OP甚至没有意识到您的解决方案一开始就解决了他的问题。这很好,因为它同时提供了更改索引和值。如果我只想返回索引值而不是键,我需要修改哪些代码?或者这在分组方式中是不可能的?请原谅我对该主题的无知,您的第二个答案符合我的需要,只需提供索引。@user965586无需原谅;很高兴我能帮上忙。这个解决方案很可爱,但太复杂了,没有用处。这项任务确实很简单,因此应该有一个简单的解决办法。任何时候我使用
itemgetter
我都需要它。任何看你代码的人都很难弄明白这行代码的作用。很明显,OP一开始甚至没有意识到你的解决方案解决了他的问题。这是一个很好的简单的例子,但我会做
it=iter(myList)
然后
x0=next(it)
然后
枚举(it)
print I
中的I、x,这样你就不必看列表中的第一项两次,不必每次都做减法运算。这是一个很好的简单例子,但我会做
it=iter(myList)
然后
x0=next(it)
然后
I,x在enumerate(it)
print I
中,所以你不必看列表中的第一项两次,另一种选择:
[i for i,(a,b)在enumerate(zip(myList,myList[1:])中,如果a!=b]
,这应该更快,但缺点是它需要一份
myList
@agf的副本:我无意粗鲁,但你的评论毫无意义。你认为Python列表是作为链表实现的吗?恰恰相反;实际上,它们基本上是数组,所以列表访问是O(1)。看@machineyearning你完全正确,我不知道我在想什么——我知道它们不是链表,只是脑子出了问题。纠正某人并不粗鲁:)+1,这是一个很好的方法——只要你正在做的任何事情都有长度并且是可索引的(如问题中的示例所示)。另一种选择:
[i for i,(a,b)在enumerate(zip(myList,myList[1:])中,如果a!=b]
,这应该会更快,但缺点是它需要一份
myList
@agf:我无意粗鲁,但你的评论毫无意义。你认为Python列表是作为链表实现的吗?恰恰相反;实际上,它们基本上是数组,所以列表访问是O(1)。看@machineyearning你完全正确,我不知道我在想什么——我知道它们不是链表,只是脑子出了问题。纠正某人并不粗鲁:)+1,这是一个很好的方法——只要你正在研究的东西有一个长度并且是可转位的(如问题中的示例所示)。