2013-11-22 3 views
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 

и т.д ..

Что такое лучший способ сохранить эти данные и иметь возможность выводить его в виде таблицы, как указано выше?

+1

'itertools.groupby' – wim

ответ

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

Похоже, что вы говорите в основном Run Length Encoding

я бы, вероятно, использовать, по крайней мере, в качестве промежуточного представления, список двух кортежей стоимости и сосчитать.

Я бы продемонстрировал реализацию этого, но ответ karthikr, использующий itertools.groupby, лучше, чем то, что я собирался написать.

Из этих данных можно определить начальные и конечные позиции для таблицы, которую вы описали:

begin = 0 
for value, length in rle_tuples: 
    print begin, begin+length-1, value 
    begin += length 
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 
+0

Почему вы используете перечисление и itemgetter здесь? – SpoonMeiser

+0

@SpoonMeiser Я использую перечисление для делегирования его вычисления индекса. Этот индекс извлекается в первый _index. Itemgetter просто позволяет мне группировать перечисленные кортежи только по значению без индекса. – ovgolovin

+0

@SpoonMeiser Другие решения генерируют временные/списки в память для всего прогона. Мое решение этого не делает, но имеет немного более сложный код. – ovgolovin

Смежные вопросы