我有一个清单:
l = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
我想存储每个连续运行块,例如:
Begin End Value
0 3 1
4 8 0
等。
存储此数据的最佳方法是什么,并能够在如上所示的表格视图中输出?
答案 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