【发布时间】:2013-11-22 23:34:27
【问题描述】:
我有一个清单:
l = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
我想存储每个连续运行的块,这样:
Begin End Value
0 3 1
4 8 0
等等。
存储这些数据并能够以上述表格形式将其输出的最佳方式是什么?
【问题讨论】:
我有一个清单:
l = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
我想存储每个连续运行的块,这样:
Begin End Value
0 3 1
4 8 0
等等。
存储这些数据并能够以上述表格形式将其输出的最佳方式是什么?
【问题讨论】:
你可以把它分解一下,但这确实是运行和长度:
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]]
【讨论】:
>>> 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
【讨论】:
听起来你说的基本上是Run Length Encoding
我可能会使用,至少作为中间表示,值和计数的二元组列表。
我会展示一个实现,但 karthikr 使用 itertools.groupby 的答案比我要写的要好。
根据该数据,您可以确定您描述的表格的开始和结束位置:
begin = 0
for value, length in rle_tuples:
print begin, begin+length-1, value
begin += length
【讨论】: