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

时间:2013-04-30 20:07:23

标签: python dictionary range

我想根据标识符列,起始值和结束值来比较几组文件。每个文件都具有以下布局: 防爆。

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)

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

1 个答案:

答案 0 :(得分: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应该包含具有重叠的所有不同文件集的as键,而值将是在这组文件中具有重叠对应项的范围数组。包含单个文件的键将列出该文件中唯一的范围。

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