首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将重叠数值范围合并为连续范围

将重叠数值范围合并为连续范围
EN

Stack Overflow用户
提问于 2014-06-19 14:24:03
回答 2查看 2.1K关注 0票数 4

我正在尝试将基因组坐标的范围合并为连续的范围,并增加了一个跨越空白的合并选项。

例如,如果我有基因组范围[[0, 1000], [5, 1100]],我希望结果是[0, 1100]。如果偏移量选项被设置为100,并且输入是[[0, 1000], [1090, 1000]],我将再次希望结果是[0, 1100]

我已经实现了这样一种方法,它顺序地通过对齐,并尝试在前一个结束位置和下一个起始位置上合并,但是它失败了,因为实际的结果有不同的长度。例如,我的列表中的结果[[138, 821],[177, 1158], [224, 905], [401, 1169]]按起始位置排序。答案应该是[138, 1169],但我得到的是[[138, 1158], [177, 905], [224, 1169]]。显然,我需要考虑的不仅仅是前一个结束和下一个开始,但我还没有找到一个好的解决方案(最好不是一个庞大的if语句巢)。有人有什么建议吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def overlap_alignments(align, gene, overlap):
    #make sure alignments are sorted first by chromosome then by start pos on chrom
    align = sorted(align, key = lambda x: (x[0], x[1]))
    merged = list()
    for i in xrange(1, len(align)):
        prv, nxt = align[i-1], align[i]
        if prv[0] == nxt[0] and prv[2] + overlap >= nxt[1]:
            start, end = prv[1], nxt[2]
            chrom = prv[0]
            merged.append([chrom, start, end, gene])
    return merged
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-19 15:00:39

那么,如何跟踪每个开始和结束以及每个职位所属的范围的数量?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def overlap_alignments(align, overlap):
    # create a list of starts and ends
    stends = [ (a[0], 1) for a in align ]
    stends += [ (a[1] + overlap, -1) for a in align ]
    stends.sort(key=lambda x: x[0])

    # now we should have a list of starts and ends ordered by position,
    # e.g. if the ranges are 5..10, 8..15, and 12..13, we have
    # (5,1), (8,1), (10,-1), (12,1), (13,-1), (15,-1)

    # next, we form a cumulative sum of this
    s = 0
    cs = []
    for se in stends:
        s += se[1]
        cs.append((se[0], s))
    # this is, with the numbers above, (5,1), (8,2), (10,1), (12,2), (13,1), (15,0)
    # so, 5..8 belongs to one range, 8..10 belongs to two overlapping range,
    # 10..12 belongs to one range, etc

    # now we'll find all contiguous ranges
    # when we traverse through the list of depths (number of overlapping ranges), a new
    # range starts when the earlier number of overlapping ranges has been 0
    # a range ends when the new number of overlapping ranges is zero 
    prevdepth = 0
    start = 0
    combined = []
    for pos, depth in cs:
        if prevdepth == 0:
            start = pos
        elif depth == 0
            combined.append((start, pos-overlap))
        prevdepth = depth

    return combined

这要比解释容易得多。(是的,累积和可以写在较短的空格内,但我觉得这样写得更清楚。)

为了以图形方式解释这一点,让我们以输入(5,10,8,15,12,13,16,20)和overlap=1为例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.....XXXXXo.............. (5-10)
........XXXXXXXo......... (8-15)
............Xo........... (12-13)
................XXXXo.... (16-20)
.....1112221221111111.... number of ranges at each position
.....----------------.... number of ranges > 0
.....---------------..... overlap corrected (5-20)
票数 4
EN

Stack Overflow用户

发布于 2014-06-19 16:39:23

Python来了包括电池

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from itertools import chain

flatten = chain.from_iterable

LEFT, RIGHT = 1, -1

def join_ranges(data, offset=0):
    data = sorted(flatten(((start, LEFT), (stop + offset, RIGHT))
            for start, stop in data))
    c = 0
    for value, label in data:
        if c == 0:
            x = value
        c += label
        if c == 0:
            yield x, value - offset

if __name__ == '__main__':
    print list(join_ranges([[138, 821], [900, 910], [905, 915]]))
    print list(join_ranges([[138, 821], [900, 910], [905, 915]], 80))

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[(138, 821), (900, 915)]
[(138, 915)]

它是如何工作的:我们把每个起点和终点都贴上标签,然后排序,然后我们简单地计算每一个起点和每个终点。如果我们已经访问了相同数量的起点和终点,我们有一个封闭的(加入)范围。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24317211

复制
相关文章
如何在一周内摸清一个行业?
在和咨询、投行、投资、猎头这些行业的人聊天的时候,我反复听到“一周”这个时间,于是我也开始好奇:你们是在什么情况下需要在一个星期之内了解一个行业?你们都是如何做到在一个星期之内摸清一个行业的?
用户1756920
2018/07/23
8430
如何在一周内完成上万固定资产的盘点?
随着企业的不断发展壮大,固定资产的数量和种类也在不断增多,对于企业来说,对固定资产的管理和盘点显得越来越重要。而传统的手工盘点方式,不仅效率低下,而且容易出现漏盘和重复盘点等问题。为了更加高效地管理和盘点企业的固定资产,现在许多企业正在采用固定资产管理系统,其中易点易动固定资产管理系统是一款功能齐全、通用共性高的固定资产管理和盘点系统。
易点易动固定资产管理系统
2023/04/04
2350
如何在一周内完成上万固定资产的盘点?
jQuery 追加元素的方法如append、prepend、before
jQuery after() 方法在被选元素之后插入内容。 jQuery before() 方法在被选元素之前插入内容。 实例
用户5640963
2019/07/28
1K0
学习Linux,如快速入门?
随着现在互联网时代的爆发,越来越多的企业开始需要Linux工程师,相对应的Linux工程师的薪资待遇也越来高,那么Linux到底是什么?如何快速入门呢?今天我就为大家讲一讲如何快速入门学习Linux。
小小科
2020/04/16
1.4K0
JQuery学习—JQuery的Validform学习
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/121265.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/19
5110
JQuery学习—JQuery的Validform学习
如何在 Python 内使用深度学习实现 iPhone X 的 FaceID
在最近推出的 iPhone X 中,它被讨论最多的特点之一是它采用了新的解锁方法,即 TouchID:FaceID。
AI研习社
2018/09/25
8130
如何在 Python 内使用深度学习实现 iPhone X 的 FaceID
jQuery学习笔记——jQuery基础
什么是jQuery?jQuery是一个快速、简洁的JavaScript库,其设计宗旨是“write less,do more”,倡导用更少的代码,做更多的事情。通过这段时间的学习,我感觉jQuery是一个“语法糖”,就像是包在糖果外面的包装,让js看起来更好看。
颜颜yan_
2022/12/01
14.1K0
jQuery学习笔记——jQuery基础
jquery学习
<1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team。
菲宇
2019/06/13
2.3K0
JQuery学习—JQuery-Validation 使用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/121266.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/19
4.6K0
jQuery Cheat—Sheet(jQuery学习笔记)
jQuery Cheat—Sheet(jQuery学习笔记) Web前端学习笔记之——jQuery学习笔记 ---- 什么是jQuery? jQuery是一种JavaScript库,实现了常见任务的自动化和复杂任务简单化。 jQuery库为Web脚本编程提供了通用的抽象层,使之适合任何脚本编程情景。 jQuery能满足以下需求: 取得文档中的元素、修改页面外观、改变文档内容、响应用户的交互操作、为页面添加动态效果、不刷新加载、简化常见的JavaScript任务。 ---- jQuery版本?
李郑
2018/03/01
16.2K0
jQuery Cheat—Sheet(jQuery学习笔记)
统计一周内每天销售总额SQL语句
通过前端給过来的图,我们只需要统计一周内的订单总量和 订单总金额,一开始我的想法是写多个sql语句,然后再插入到一个数组中去,最后的结果你知道的,效率很低很低。
宁在春
2022/10/31
9450
统计一周内每天销售总额SQL语句
JQuery基础学习
JQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨 是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
乐心湖
2021/01/18
3.7K0
如何在GridView的Footer内显示总计?
前台: <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound" ShowFooter="true"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:Label ID="labelfirst" runat="server" Text='<%# Eval("first") %>'>
菩提树下的杨过
2018/01/22
9300
jQuery学习笔记
jQuery大部分功能需要根据文档的DOM模型来工作,首先需要正确地解析到整个文档的DOM模型结构。使用jQuery需要在整个文档被浏览器完全加载后才开始进行。
wangxl
2018/07/27
3.5K0
JQuery的学习
JQuery基础: 1. 概念: * 一个JavaScript框架,简化JS开发。 * jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 * JavaScript
Rochester
2020/09/01
16.6K0
jQuery学习笔记
jQuery大部分功能需要根据文档的DOM模型来工作,首先需要正确地解析到整个文档的DOM模型结构。使用jQuery需要在整个文档被浏览器完全加载后才开始进行。
用户9076598
2022/03/02
6280
jQuery 学习(一)
<div id="a" style="background:#ccc" onclick="$(this).hide();" >点击我隐藏</div> //$(this).hide this 当前html元素,就是说当前元素点击隐藏。 `$("#a").show();` //id="" 选择器是"#"号 `$(".a").show();` //class="" 选择器是"."号 alert($(".input").html()); `alert($(".input").val());` //
简单、
2018/07/18
3330
jQuery学习笔记
jQuery函数位于一个document ready函数中,我们需要在js中加载该函数文档
Mirror王宇阳
2020/11/13
7.4K0
jQuery学习笔记
jQuery学习笔记
jQuery对象的text()和html()方法分别获取节点的文本和原始HTML文本
用户2700375
2022/06/09
1.3K0
jQuery学习笔记
JQuery 学习—JQuery Validation表单验证范例[通俗易懂]
jQuery Validato表单验证插件,它是基于jQuery类库,实现了js脚本于页面html代码的分离。你可以划分多个校验组,每个组的校验都是互不影响。对一个表单对象,你只需要写一行代码就可以轻松实现无数种(理论上)脚本控制。
全栈程序员站长
2022/07/19
1.8K0

相似问题

如何在一周内学习Sharepoint?

11

Jquery插件-选择一周内的时间

22

一周内合计

23

Jquery -关闭后一周内不要显示div (弹出)

11

如何在jquery中学习?

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文