2014-11-24 57 views
1

我使用Python 2.7.5,我有一个列表看起来像这样:查找和替换列表中的空行宽的Python

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

名单是千疮百孔,我想找出空行和用下一个非空行填充数据。如果有一个包含数据我想设置那些为0。像这种没有下一行:

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

我怎样才能做到这一点与Python?我可以做一个简单的循环来识别空行,但我不知道如何填补空白... 任何帮助将不胜感激! 谢谢 马丁

+1

这不是一个列表,但一个元组。你的意思是[]而不是()? – 2014-11-24 08:46:50

+0

对不起,它是一个元组。我用zip(*数据)调换了数据并得到了一个元组返回 – 2014-11-24 08:52:17

回答

1

很容易记录一个循环中的前一个值比未来的值。所以我的想法是扭转名单。用前一个空值替换。最后将列表反转回来,你会得到结果。

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

我喜欢这个论坛,谢谢! – 2014-11-24 09:01:15

+0

不客气... – 2014-11-24 09:02:10

1
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 
+0

相当于BHAT IRSHAD的答案,只是它使尾随零字符串。 – TheBigH 2014-11-24 09:04:54

3

您可以使用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']