Python 具有范围的唯一重复行

Python 具有范围的唯一重复行,python,Python,我有一个这样的文件: x 48012 F 1.000 x 48169 R 0.361 x 87041 R 0.118 x 9032 R 0.176 x 9150 R 0.521 我想根据列1、2和3是否相同,筛选出结果文件中具有唯一值的行—列2的公差为+/-200。 比如前两行 x 48012 F 1.000 x 48169 R 0.361 将成为 x 48012 F 1.000 因为48169-48012是157,在±200范围内 总的来说,最终文件是 x 4

我有一个这样的文件:

x 48012  F 1.000
x 48169  R 0.361
x 87041  R 0.118
x 9032   R 0.176
x 9150   R 0.521
我想根据列1、2和3是否相同,筛选出结果文件中具有唯一值的行—列2的公差为+/-200。 比如前两行

x 48012  F 1.000
x 48169  R 0.361
将成为

x 48012  F 1.000
因为48169-48012是157,在±200范围内

总的来说,最终文件是

    x 48012  F 1.000
    x 87041  R 0.118
    x 9032   R 0.176
我试过了

out=open('result.txt', 'w')
my_file= open('test.txt', 'r')
seen = set()
for line in my_file:
        line=line.strip().split('\t')
        if line[0]==seen[0] and line[2]==seen[2] and ((int(line[1])==int(seen[1]-200)) or (int(line[1])==(seen[1]-200))):
            out.write(line)
但是集合不能被索引

请尝试以下操作:

with open('result.txt', 'w') as out:
    with open('file_36086075.txt', 'r') as my_file:
        row1 = None
        row2 = None
        for line in my_file:
            if not row1:
                row1=line.strip().split('\t')
            else:
                if not row2:
                    row2=line.strip().split('\t')
            if row1 and row2:
                diff = int(row1[1]) - int(row2[1])
                if row1[0]==row2[0] and row1[2]==row2[2] and (diff >= -200 and diff <= 200):
                    out.write('\t'.join(row1) + '\n')
                    row1 = None
                    row2 = None
                else:
                    out.write('\t'.join(row1) + '\n')
                    row1 = row2
                    row2 = None
打开('result.txt',w')作为输出的
:
打开('file_36086075.txt','r')作为我的文件:
第1行=无
第2行=无
对于my_文件中的行:
如果不是第1行:
行1=line.strip().split('\t')
其他:
如果不是第2行:
row2=line.strip().split('\t')
如果第1行和第2行:
diff=int(第1行[1])-int(第2行[1])

如果row1[0]==row2[0]和row1[2]==row2[2]和(diff>=-200和diff在这里使用Set是没有意义的,因为您必须将元素分解为标记,这样它们很难管理。我将使用一对二维数组,一个用于候选行,一个用于结果

我会将整个文件读入一个候选数组并创建一个空的结果数组。然后我会遍历候选数组并在结果数组中查找匹配项。如果在结果数组中找不到匹配项,我会将候选项复制到结果数组中

比如:

candidates = []
results = []
for line in my_file:
    candidates.append(line.split('\t'))
for line in candidates:
    seen = false
    for possible_match in results:
        if matching_line(possible_match, line):
            seen = true
    if seen:
        continue
    else:
        results.append(line)
然后需要一个函数来确定两个数组是否匹配:

function matching_line(array1, array2):
    if array1[0] = array2[0]
    ..etc

你的问题很令人困惑1)唯一重复行?2) 最后两排?。请尽量解释清楚你想要什么。你想删除那些重复的行,标记它们,还是做什么?我对问题的编辑有帮助吗?没有太多。我已经改写了,但你的编辑比我的要重。“unique”在英语中不是一个动词,所以事情就从这里开始走下坡路了。所以。。。对于矩阵中的行,如果行[row_值2](如果索引为零,则为1)减去行+1[row_值2]小于或大于200,是否删除行+1(整个下一行)?是吗?是的,这就是我想做的事情它起作用了!但是我可以问一下seed[]是从哪里来的,有必要吗?没有,我忘了删除这行。有什么方法可以重复这个吗?通过在我的文件中的for行前面放置一个while循环?啊,是的,这是有意义的,似乎这是一种获取文件中所有重复行的方法,但是对于函数部分,我是否返回array1?否,您应该只返回一个布尔值,如果两行需要合并,则返回true;如果不需要合并,则返回false。如何使用“seen?”“seen”表示结果数组中已存在匹配项。如果seen为true,我们不想将此条目添加到数组中,因为我们已经有一个太相似的条目。我猜您应该这样编写文件:
对于行内结果:
对于行内元素:
out.write(element)