0

我有几组文件,我想根据标识符列、起始值和结束值进行比较。每个文件都有以下布局: 例如。

A    200    900
A    300    1200
B    100    700
B    900    1000

每个文件的标识符和值各不相同,我想比较 2 到 4 组这些文件的重叠。因此,如果另一个文件有“A 150 1000”,我会得到两个文件之间的重叠。

例如,如果我放入 4 个文件,每个文件有 100 行,我想知道每个文件之间重叠(或不重叠)的数量。

FileA only =
FileB only = 
FileC only = 
FileD only = 
FileA and FileB = 
FileA and FileC =
FileA and FileD =
FileA, FileB and FileC =
....

我的代码目前看起来像:

def ReadFile(FileName, LineCount, Ranges)
    with open(FileName, "r") as FileName:
        LineCount = 0
        for Line in FileName:
            if LineCount==0:
                print "Skipping First Line"
            else:
                Line = Line.strip("\n").split("\t")
                Chr = Line[0]
                Start = int(Line[1])
                End = int(Line[2])
                ranges[Ident].append((Start, End))
            LineCount+=1

FileNum = int(raw_input("Number of Files for Comparison"))
rangesA = rangesB = rangesC = rangesD =defaultdict(list)

ReadFile(FileA, LineCountA, rangesA)
ReadFile(FileB, LineCountB, rangesB)
if FileNum >= 3:
    ReadFile(FileC, LineCountC, rangesC)
if FileNum >= 4:
    ReadFile(FileD, LineCountD, rangesD)

如果要进行比较,我有点卡住了...

4

1 回答 1

1

我建议为每个文件获取这种格式的范围:

rangesForFile0[
    ("A", 100, 1500, "file0"),
    ("A", 400, 1000, "file0"),
    ...
]

然后,将所有范围放在一个列表中:

allRanges = rangesForFile0 + rangesForFile1 + ...

然后按标签对列表进行排序,然后按起始值排序(考虑到元组中字段的顺序,这应该足够了):

allRanges.sort()

然后浏览范围列表,并为每个范围检查它与哪些其他范围重叠,并注意这些其他范围来自哪些文件:

def rangesOverlap(x1, x2, y1, y2):
    return (x1 <= y2) and (y1 <= x2)

fileSetToRangesMap = {}
for i, r in enumerate(allRanges):
    fileSet = set([r[3]])
    x1 = r[1]
    x2 = r[2]
    for j, r2 in enumerate(allRanges):
        y1 = r2[1]
        y2 = r2[2]
        if (r[0] == r2[0]) and rangesOverlap(x1, x2, y1, y2):
            fileSet.add(r2[3])
    fileSetToRangesMap.setdefault(frozenset(fileSet), []).append(r)

在此之后,fileSetToRangesMap 应该包含所有具有重叠的不同文件集作为键,而值将是在这组文件中具有重叠对应项的范围数组。包含单个文件的键将列出该文件中唯一的那些范围。

以上将范围 (100, 400) 和 (200, 500) 视为重叠。如果您只需要计算一个范围完全包含来自不同文件的另一个范围的范围,那么文件的顺序就变得很重要,您需要在范围和文件之间构建更复杂的方向关系图

于 2013-04-30T21:17:27.080 回答