Найти и заменить пустые строки в списке шириной Python

Я использую Python 2.7.5 и у меня есть список, похожий на этот:

('2047', '1971', '', '1919', '', '1878', '', '', '1760', '1731', '', '1667', '', '')

Список полон дыр, я хочу определить пустые строки и заполнить их данными из следующей непустой строки. И если нет следующих строк, содержащих данные, я хочу установить их в 0. Вот так:

('2047', '1971', '1919', '1919', '1878', '1878', '1760', '1760', '1760', '1731', '1667', '1667','0','0')

Как я могу сделать это с Python? Я могу сделать простой цикл для определения пустой строки, но я не знаю, как заполнить пробелы... Любая помощь будет высоко ценится! Спасибо мартин

3 ответа

Решение

Легко вести запись предыдущего значения в цикле, чем приходящих значений. Поэтому моя идея состоит в том, чтобы полностью изменить список. Замените каждое пустое значение на предыдущее. Наконец, переверните список обратно, и вы получите результат.

>>> lst=('2047', '1971', '', '1919', '', '1878', '', '', '1760', '1731', '', '1667', '', '')
>>> lst=list(lst[::-1])
>>> pr=0
>>> for j in range(len(lst)):
...     if lst[j]=='':
...        lst[j]=pr
...     else:
...        pr=lst[j]
... 
>>> lst=lst[::-1]
>>> lst
['2047', '1971', '1919', '1919', '1878', '1878', '1760', '1760', '1760', '1731', '1667', '1667', 0, 0]

Ты можешь использовать itertools.groupby за это:

>>> from itertools import groupby
>>> t = ('2047', '1971', '', '1919', '', '1878', '', '', '1760', '1731', '', '1667', '', '')
>>> out = []
>>> prev = None
for k, g in groupby(reversed(t)):
    if k == '' and prev is None:
        out.extend('0' for _ in g)
    elif k == '' and prev is not None:
        out.extend(prev for _ in g)
    else:
        for x in g:
            out.append(x)
        prev = x
...             
>>> out.reverse()
>>> out
['2047', '1971', '1919', '1919', '1878', '1878', '1760', '1760', '1760', '1731', '1667', '1667', '0', '0']
yourList = ['2047', '1971', '', '1919', '', '1878', '', '', '1760', '1731', '', '1667', '', '']

lastVal = '0'
for i in range( len(yourList) -1, 0, -1 ):
  if len(yourList[i])==0:
    yourList[i ]= lastVal
  else:
    lastVal = yourList[i]

print yourList
Другие вопросы по тегам