从职位列表创建时间间隔

时间:2013-08-27 08:42:56

标签: python intervals

我又遇到了一些小问题。我有一个看起来像这样的文件:

chr1    142936580   142936581   209
chr1    142936581   142936582   208
chr1    142936582   142936583   212
chr1    142936583   142936584   210
chr1    142936588   142936590   215
chr1    142936590   142936591   217
chr1    142936591   142936592   221
chr1    142936592   142936593   220
chr1    145034453   145034454   222
chr1    145034454   145034455   220
chr1    145034455   145034456   218
chr1    145034456   145034457   215
chr1    145034457   145034459   216
chr1    145034459   145034460   212
chr1    161418656   161418657   178
chr1    161418657   161418658   177
chr1    161418658   161418659   179
chr2    90386745    90386747    222
chr2    90386747    90386748    221
chr2    90386748    90386750    220

这里的问题是我的文件中有太多条目,我想减少它们开始:以下列方式结束间隔(至少这是我能想到的最好的): 使用第一列排序,然后仅使用第二列并减少它。我的意思是,如果条目lis在从142开始的范围内,则保持最低和最高条目作为开始,结束位置。然后移动到145 *位置并做同样的事情。因此,基本上为那些彼此间隔开的条目组创建开始,结束位置。 我们最终会或多或少地结束:

chr1    142936580 142936592
chr1    145034453 145034459
chr1    161418656 161418658
chr2    90386745 90386748

多数民众赞成我的想法如何做到这一点。但是,我仍然坚持使用什么代码。 甚至建议都很好 谢谢, 伊雷克

2 个答案:

答案 0 :(得分:1)

如果我理解,你想组合连续的间隔。 我的提案

from csv import reader
LIMITINTER= 10
with open("fichierin.txt") as f:
    read = reader(f,delimiter="\t")
    first = last =  None
    for line in read:
        if last is None:
            first = last = line
        else:
            if abs(int(line[1]) - int(last[2])) < LIMITINTER :
                last = line
                continue
            else:

                print last[0], first[1], last[2]
                first = last = line

    print last[0], first[1], last[2]

你会有

chr1 142936580 142936593
chr1 145034453 145034460
chr1 161418656 161418659
chr2 90386745  90386750 

你可以把它放在功能和产生线,或写在另一个文件等....

编辑:现在最小差异是常数

答案 1 :(得分:0)

您可以遍历文件并跟踪特定范围内的第一个和最后一个数字。您可以通过转换为整数然后除以10的幂来提取范围。使用字典存储范围的最低值和最高值。