如何跳过列表中的行并根据索引号添加到文件?蟒蛇

时间:2016-03-02 14:40:58

标签: python list

我有一个列表,条目用新行分隔:

lines=[
 '  22414035.537   117786547.45218     -3116.294                                  \n',
 '                  22414038.860    22414035.186    87957488.29217     -2327.383  \n',
 '  20484531.215   107646935.64119     -1170.828                                  \n',
 '                  20484533.402    20484530.680    80385700.15618      -874.345  \n',
 '  22744037.211   119520718.50318      3083.940                                  \n',
 '                  22744039.645    22744037.355    89252483.05018      2302.858  \n']

我有另一个清单:

Indx=[1]

- 注意,此列表可以由多个条目填充。

我想遍历列表,如果每两行的索引等于列表中的值,Indx,那么我想什么都不做。如果每两行的indx不等于Indx的值,那么我想将相应的行和文件中的下一行添加到新文件中。

例如,在这种情况下,新文件将包含:

   22414035.537   117786547.45218     -3116.294                                  
                   22414038.860    22414035.186    87957488.29217     -2327.383  
   22744037.211   119520718.50318      3083.940                                  
                   22744039.645    22744037.355    89252483.05018      2302.858  

我目前遇到的问题是我无法跳到列表中的下一行。此外,即使计数与Indx列表中的值相等,我的代码也会在文件中添加行。

继承我的代码:

EditedRinexObs=open("H:\Uni Work\EditedRinexObs.16o", "a")
for line in lines:
    if ('g') not in line:
        count=(0)
        it=iter(lines)
        for x in indx:
            if count != x:
                EditedRinexObs.writelines(line)
                EditedRinexObs.writelines("\n")
                it.next()
                EditedRinexObs.writelines(line)
                EditedRinexObs.writelines("\n")
                it.next()
                count=count+1
             elif count == x:
                it.next()
                it.next()
                count=count+1
EditedRinexObs.close()   

我希望这是有道理的,我不确定最新情况,在其他问题上找不到答案。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

如果您只想计算对,请创建一组索引并压缩每两行分组的行,只会产生索引不在集合中的行:

google.maps.event.addListener($scope.map.control.getGMap(), 'center_changed',function() {
    console.log($scope.map.control.getGMap().getCenter().toUrlValue());
});

哪会给你:

def pairs(l,inds):
    it = iter(l)
    st = set(inds)
    for ind, (a, b) in enumerate(zip(it, it)):
        if ind not in st:
            yield a,b

print(list(pairs(lines, Indx)))

如果你想考虑重叠对,你可以使用成对配方但是你可以得到重复,所以你需要决定你想做什么,如果是这样的话,它将是这样的:

[('  22414035.537   117786547.45218     -3116.294                                  \n',
  '                  22414038.860    22414035.186    87957488.29217     -2327.383  \n'),
 ('  22744037.211   119520718.50318      3083.940                                  \n',
  '                  22744039.645    22744037.355    89252483.05018      2302.858  \n')]

答案 1 :(得分:1)

这是一个非常简单的方法,不需要iter,虽然我必须承认我喜欢Padraic的解决方案。 :)

我会输出到stdout,以保持简单。我已将Indx更改为indx以符合通常的Python约定:简单变量名称应以小写字母开头;以大写字母开头的名称用于类。我也把它变成了一个集合,因为测试集合的成员资格通常比测试列表的成员资格要快,尽管对于非常小的列表,列表可能更快。

import sys

lines = [
    '  22414035.537   117786547.45218     -3116.294                                  \n',
    '                  22414038.860    22414035.186    87957488.29217     -2327.383  \n',
    '  20484531.215   107646935.64119     -1170.828                                  \n',
    '                  20484533.402    20484530.680    80385700.15618      -874.345  \n',
    '  22744037.211   119520718.50318      3083.940                                  \n',
    '                  22744039.645    22744037.355    89252483.05018      2302.858  \n'
]

indx = set([1])

out = sys.stdout

for i in range(len(lines) // 2):
    if i not in indx:
        out.write(lines[2*i])
        out.write(lines[2*i + 1])            

<强>输出

  22414035.537   117786547.45218     -3116.294                                  
                  22414038.860    22414035.186    87957488.29217     -2327.383  
  22744037.211   119520718.50318      3083.940                                  
                  22744039.645    22744037.355    89252483.05018      2302.858