比较Python列表中的值之间的差异

时间:2014-04-29 20:15:33

标签: python list slice

我们说我有一个整数列表:

list = [1,2,3,5,6,7,10,11,12]

我想将列表分成三个单独的列表,分割发生在连续整数之间,差异> = 2,这会给我

list1 = [1, 2, 3]
list2 = [5, 6, 7]
list3 = [10, 11, 12]

在Python中有一种直接的方法吗?我想这样做是为了分析来自心理学实验的数据,其中我有一个带时间戳的响应列表,并希望根据它们之间的距离来聚类响应

1 个答案:

答案 0 :(得分:4)

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

如您所见,连续值最终具有相同的分组键。这是因为

  

如果data [i] + 1 == data [i + 1]:

     

然后数据[i] - i == data [i] + 1 - 1 - i == data [i + 1] - (i + 1)

仅供参考,groupby来自itertoolsitemgetter来自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]