Найти и заменить пустые строки в списке шириной 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