假设我有一个整数列表:
list = [1,2,3,5,6,7,10,11,12]
我想把这个列表除以三个单独的列表,在具有不同>=2的连续整数之间发生分裂,这将给我
list1 = [1, 2, 3]
list2 = [5, 6, 7]
list3 = [10, 11, 12]
在Python中有一种简单的方法可以做到这一点吗?我想这样做是为了分析心理学实验中的数据,在这个实验中,我有一个时间戳响应列表,并且希望根据它们之间的距离来聚类响应。
发布于 2014-04-29 20:25:08
看看this StackOverflow question。这里的答案向您展示了如何将列表划分为连续整数的子列表。
从已接受的答复来看:
>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
... print map(itemgetter(1), g)
...
[1]
[4, 5, 6]
[10]
[15, 16, 17, 18]
[22]
[25, 26, 27, 28]
答案并没有解释这里发生了什么,所以我会解释。首先,它假定data
按升序排序。枚举data
然后给出一个索引、值对的列表。然后,它使用索引减去值作为分组项的键。看看这会给你的列表带来什么:
>>> myList = [1,2,3,5,6,7,10,11,12]
>>> [i - x for i, x in enumerate(myList)]
[-1, -1, -1, -2, -2, -2, -4, -4, -4]
如您所见,连续值最终具有相同的分组键。这是因为
如果datai +1 == datai+1: 然后是datai -i == datai +1-1-i == datai+1 - (i + 1)
groupby
来自itertools
,itemgetter
来自operator
。因此,将这些行添加到您的导入:
from itertools import groupby
from operator import itemgetter
请注意,只有在对data
进行排序并且不包含任何重复项的情况下,此解决方案才能工作。当然,将列表转换为排序集非常简单:
>>> myList = [1, 1, 3, 5, 6, 4, 10, 12, 11, 1, 2]
>>> myList = list(sorted(set(myList)))
>>> print myList
[1, 2, 3, 4, 5, 6, 10, 11, 12]
https://stackoverflow.com/questions/23374437
复制相似问题