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