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))