从列表中提取连续数据

时间:2013-11-22 23:34:28

标签: python list output

我有一个清单:

l = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]

我想存储每个连续运行块,例如:

Begin End Value
0     3   1
4     8   0

等。

存储此数据的最佳方法是什么,并能够在如上所示的表格视图中输出?

3 个答案:

答案 0 :(得分:2)

你可以稍微分解一下,但这确实有效和长度:

from itertools import groupby
from operator import itemgetter

data = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
blocks = [map(itemgetter(0), itemgetter(0, -1)(list(g))) + [k] for k, g in groupby(enumerate(data), itemgetter(1))]
# [[0, 3, 1], [4, 8, 0], [9, 11, 1], [12, 13, 0]]

答案 1 :(得分:0)

听起来你所说的基本上是Run Length Encoding

我可能会使用,至少作为中间表示,列出两元组的值和计数。

我会展示一下这个实现,但karthikr使用itertools.groupby的答案比我要编写的更好。

根据该数据,您可以确定所描述的表的开始和结束位置:

begin = 0
for value, length in rle_tuples:
    print begin, begin+length-1, value
    begin += length

答案 2 :(得分:0)

>>> L = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> for key,it in groupby(enumerate(L), key=itemgetter(1)):
    first_index = next(it)[0]  # at least one value will always exist
    end_index = first_index + sum(1 for _ in it)
    print('{:3}{:3}{:3}'.format(first_index, end_index, key))


  0  3  1
  4  8  0
  9 11  1
 12 13  0