簡體   English   中英

如何跳過列表中的行並根據索引號添加到文件中? Python

[英]how to skip over lines in a list and add to a file based on index number? python

我有一個列表,條目以新行分隔:

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()   

我希望這是有道理的,我不確定發生了什么,也無法在其他問題中找到答案。

如果您只想計算對,請創建一組索引並將每兩行分組在一起的行壓縮,只產生索引不在集合中的行:

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')]

如果您想考慮重疊對,您可以使用成對配方,但是您可以獲得重復項,因此您需要決定在這種情況下要做什么,它會是這樣的:

from itertools import izip, tee, count

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)




def pairs(l, inds):
    st = set(inds)
    pr, cn = pairwise(l), count(0)
    prev = 0
    for a, b in pr:
        i = next(cn)
        if i not in st:
            if i - 1 != prev:
                yield a
            yield b
            next(pr)
            prev = i

這是一種不需要iter的相當簡單的方法,盡管我必須承認我喜歡 Padraic 的解決方案。 :)

我將輸出到標准輸出,以保持簡單。 我已將您的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  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM