[英]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.