Python比较多个范围字典的重叠

Python比较多个范围字典的重叠,python,dictionary,range,Python,Dictionary,Range,我有几组文件要根据标识符列、起始值和结束值进行比较。每个文件都有以下布局: 前 每个文件中的标识符和值都不同,我想比较2到4组这些文件的重叠情况。因此,如果另一个文件有“A 150 1000”,我会得到两个文件之间的重叠 例如,如果我放入4个文件,每个文件有100行,我想知道每个文件之间的重叠(或非重叠)数量 FileA only = FileB only = FileC only = FileD only = FileA and FileB = FileA and FileC = Fi

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

每个文件中的标识符和值都不同,我想比较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)

当谈到比较时,我有点困惑…

我建议用以下格式获取每个文件的范围:

rangesForFile0[
    ("A", 100, 1500, "file0"),
    ("A", 400, 1000, "file0"),
    ...
]
然后,将所有范围放在一个列表中:

allRanges = rangesForFile0 + rangesForFile1 + ...
然后按标签对列表排序,然后按起始值排序(给定元组中字段的顺序,这就足够了):

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

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)
def rangesOverlap(x1、x2、y1、y2):

return(x1)您是否可以更具体地说,如果另一个文件有“A 150 1000”,我会得到两个文件之间的重叠?这是基于数字范围还是简单的文本比较或其他什么?我将这些值视为具有起始值和结束值的范围。因此,“A”的其中一个范围在fileA中为200-900,范围为“a”FileB中的范围是150-1000。然后我想比较FileB中有多少范围与FileB中的范围重叠,在上面的示例中是一个。感谢您的帮助。我只是在尝试实现您的解决方案时遇到了一个问题,我不确定出了什么问题。例如,如果文件A有188行,而文件B有121行,那么我运行我得到的程序:
A:167、B:111、A_B:31
如果不知道如何获得引用的输出,就很难知道问题出在哪里。最新版本的代码会很有帮助(可能很小)文件A和B的例子显示了问题。我使用的代码与上面描述的完全相同,但差异如下(第一个数字是输出,第二个是我应该得到的):
A:22452245,B:629671,C:548760,A_B:42,B_C:149165,A_C:47,A_B_C:16
在搜索与当前范围重叠的其他范围的循环中出现错误。请编辑答案以修复它。
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)