Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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_Dictionary - Fatal编程技术网

Python 查找给定位置的最近数字集

Python 查找给定位置的最近数字集,python,dictionary,Python,Dictionary,我有一本字典,看起来像这样: exons = {'NM_015665': [(0, 225), (356, 441), (563, 645), (793, 861)], etc...} 另一个文件的位置如下: isoform pos NM_015665 449 我要做的是打印文件中位置最接近的数字范围,然后打印值最接近的数字范围内的数字。对于这种情况,我想打印(356441),然后打印441。我已经成功地找到了一种方法来打印值最接近的数字集中的数字,但是我下面的代码只考虑

我有一本字典,看起来像这样:

exons = {'NM_015665': [(0, 225), (356, 441), (563, 645), (793, 861)], etc...}
另一个文件的位置如下:

isoform    pos    
NM_015665    449
我要做的是打印文件中位置最接近的数字范围,然后打印值最接近的数字范围内的数字。对于这种情况,我想打印
(356441)
,然后打印
441
。我已经成功地找到了一种方法来打印值最接近的数字集中的数字,但是我下面的代码只考虑了所列数字两侧的10个值。有没有办法考虑到每组范围之间的数字数量不同

这是我目前掌握的代码:

with open('splicing_reinitialized.txt') as f:
    reader = csv.DictReader(f,delimiter="\t")
    for row in reader:
        pos = row['pos']
        name = row['isoform']
        ppos1 = int(pos)
        if name in exons:
            y = exons[name]
            for i, (low,high) in enumerate(exons[name]):
                if low -5 <= ppos1 <= high + 5:
                    values = (low,high)
                    closest = min((low,high), key = lambda x:abs(x-ppos1))
将open('splicing_reinitialized.txt')作为f的
:
reader=csv.DictReader(f,分隔符=“\t”)
对于读取器中的行:
pos=行['pos']
名称=行['isoform']
ppos1=int(pos)
如果名称在外显子中:
y=外显子[名称]
对于枚举(外显子[名称])中的i(低,高):

如果低-5我会将其重写为最小距离搜索:

if name in exons:
    y = exons[name]
    minDist = 99999 # large number
    minIdx = None
    minNum = None
    for i, (low,high) in enumerate(y):
        dlow = abs(low - ppos1)
        dhigh = abs(high - ppos1)
        dist = min(dlow, dhigh)
        if dist < minDist:
            minDist = dist
            minIdx = i
            minNum = 0 if dlow < dhigh else 1
    print(y[minIdx])
    print(y[minIdx][minNum])
如果名称在外显子中:
y=外显子[名称]
minDist=99999#大量
minIdx=无
minNum=无
对于枚举(y)中的i(低,高):
dlow=防抱死制动系统(低-1)
dhigh=防抱死制动系统(高-1)
距离=分钟(低、高)
如果dist
这会忽略搜索范围,只需搜索最小距离对。

功能选项:)。这甚至可能运行得更快。显然,它对RAM非常友好,并且由于函数式编程的优点,可以轻松地进行并行化。我希望你会觉得学习它很有趣

from itertools import imap, izip, ifilter, repeat


def closest_point(position, interval):
    """:rtype: tuple[int, int]"""  # closest interval point, distance to it
    position_in_interval = interval[0] <= position <= interval[1]
    closest = min([(border, abs(position - border)) for border in interval], key=lambda x: x[1])
    return closest if not position_in_interval else (closest[0], 0)  # distance is 0 if position is inside an interval


def closest_interval(exons, pos):
    """:rtype: tuple[tuple[int, int], tuple[int, int]]"""
    return min(ifilter(lambda x: x[1][1], izip(exons, imap(closest_point, repeat(pos, len(exons)), exons))), 
               key=lambda x: x[1][1])


print(closest_interval(exons['NM_015665'], 449))

第一个元组是一个范围。第二个元组中的第一个整数是区间中最近的点,第二个整数是距离

你是如何定义“最接近”的?这些对在字典范围内吗?它们是x,y坐标吗?为什么在字典里你有对,但位置只有一个数字?@huck\u cussler Ranges。很抱歉,这是一个旁注。看看
snpEff
。这感觉就像你在重新发明轮子:)该工具为任何基因组位置生成完整的注释,包括你想要的信息。@Eli感谢你的snpEff注释。我一定会调查的。在这一步之后,我试图对我的数据做一些更复杂的修改,这让我觉得我必须手工完成。再次感谢:)有什么方法可以分别打印
y[minIdx]
y[minIdx][minNum]
吗?当我按照您设置的方式打印时,我可以得到正确的结果,但是当我尝试将两者分开时,它会开始打印所有范围,然后打印最接近该范围内位置的值啊,是的。谢谢你的建议:)
((356, 441), (441, 8))