Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何仅在两个输入文件区域重叠时打印它们_Python_Python 2.7 - Fatal编程技术网

Python 如何仅在两个输入文件区域重叠时打印它们

Python 如何仅在两个输入文件区域重叠时打印它们,python,python-2.7,Python,Python 2.7,我正在学习python(2.7),并尝试在两个文件范围重叠时打印它们 在文件input1.txt中,我有- p1234: 4-5, 7-12, 15-19 p5678: 7-59, 78-345 p4356: 3-4, 6-10 和文件input2.txt中- p1234: 1-3, 6-13, 16-20, 22-25 p4356: 9-10 从这两个输入文件中,我只想在两个输入文件中为每个id(每个文件中最左边的列)保留彼此重叠的范围,并放弃其他范围 也就是说,两个输出文件如下所示: o

我正在学习python(2.7),并尝试在两个文件范围重叠时打印它们

在文件input1.txt中,我有-

p1234: 4-5, 7-12, 15-19
p5678: 7-59, 78-345
p4356: 3-4, 6-10
和文件input2.txt中-

p1234: 1-3, 6-13, 16-20, 22-25
p4356: 9-10
从这两个输入文件中,我只想在两个输入文件中为每个id(每个文件中最左边的列)保留彼此重叠的范围,并放弃其他范围

也就是说,两个输出文件如下所示:

output1.txt-

p1234: 7-12, 15-19
p4356: 6-10
output2.txt-

p1234: 6-13, 16-20
p4356: 9-10
我了解到,要仅打印那些重叠的范围,我可以使用:

x = range(1,10)
y = range(8,20)

intersection = [i for i in x if i in y]


try:
    print x
    print y
except NameError:
    print intersection 
这就产生了:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
我可以从这里得到两个文件之间的范围(虽然最后一个数字没有显示),但我不知道如何在匹配两个输入文件的ID(两种输出文件格式)后仅打印两个输入文件重叠的区域。请帮忙


感谢您的考虑。

如我在评论中所建议,并进一步使用您已经开始的内容。考虑这个函数作为一个例子:

def intersect_or_not(range_, list_of_ranges):
    for range2_ in list_of_ranges:
        intersections = [i for i in range_ if i in range2_]
        if intersections:
            return True # return also breaks (if one range intersected you have a match!)
    return False

x = range(1,10)
y = [range(8,20),range(9,20)]
   
print(intersect_or_not(x,y))
#True
我想你知道该怎么办!:)

更新: 好吧,这有点太复杂了,但我还是会发布它。 假设将文件读入元组(startpos、endpos),则可以找到如下值:

def intersect_or_not(range_, list_of_ranges):
    for range2_ in list_of_ranges:
        intersections = [i for i in range_ if i in range2_]
        if intersections:
            return True
    return False
        

list1 = [(4,5), (7,12), (15,19)]
list2 = [(1,3), (6,13), (16,20), (22,25)]

#output 1
[i for i in list1 if intersect_or_not(range(*i),[range(*ii) for ii in list2])]
# [(7, 12), (15, 19)]

#output 2
[i for i in list2 if intersect_or_not(range(*i),[range(*ii) for ii in list1])]
# [(6, 13), (16, 20)]

我想你很接近!如何定义一个函数,在其中输入一个范围和一组范围并返回True或False。然后,您可以使用相反文件中的范围循环每个范围。您还可以使用np.where()和pd.dataframe.merge()函数来实现更矢量化的解决方案。是的,感谢您在@2Obe中指出这一点。我百分之百确信这是可以优化的。谢谢你的回复,先生,请你解释一下我如何匹配我的两个输入,在匹配它们的ID后,只打印重叠的区域。它远远超出了我的python。。Thanks@Bob没问题。我更新了答案。我必须说,这远远不是最佳的,但这肯定会把你推向正确的方向。你的问题本来很广泛,包括很多步骤#1以适当的格式读取文件,#2某种函数返回匹配项(可能已经写入新文件)