Python比较多个范围字典的重叠
我有几组文件要根据标识符列、起始值和结束值进行比较。每个文件都有以下布局: 前 每个文件中的标识符和值都不同,我想比较2到4组这些文件的重叠情况。因此,如果另一个文件有“A 150 1000”,我会得到两个文件之间的重叠 例如,如果我放入4个文件,每个文件有100行,我想知道每个文件之间的重叠(或非重叠)数量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
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)