我是新来的,我需要帮助处理一些我一直在努力的代码,因为我已经迷失了自己,现在只是感到困惑。
首先,我根据本网站的一些帮助创建了一个字典。我的字典样本如下:
length = {'A': [(0,21), (30,41), (70,80)] 'B': [(0,42), (70,80)]..etc}
我有一个文件,我想用它来迭代包含这些信息的词典:
A 32
B 15
etc
我想要做的是获取文件中的第一个功能,并将其与我的字典中的键匹配。一旦我匹配,我想看看我的文件中的数字与哪个范围匹配。例如,我的文件中的第一个功能将匹配A和第二个范围。这意味着我希望我的输出显示名称(A)和显示2,因为它匹配第二个范围。
我已尝试过以下代码:
import csv
with open('Exome_agg_cons_snps_pct_RefSeq_HGMD_reinitialized.txt') as f:
reader = csv.DictReader(f,delimiter="\t")
for row in reader:
snppos = row['snp_rein']
name = row['isoform']
snpos = int(snppos)
if name in exons:
y = exons[name]
if y[0] <= snpos <=y[1]:
print name,snppos
然而,这并没有给我任何输出。我不确定我的代码有什么问题。我是新人。我想我可能会遗漏一些东西。此外,我意识到我的代码不会做我想做的事情(告诉我它匹配的范围)。我正在考虑使用.index()
函数,但我不确定我能否使用它。有什么建议吗?
答案 0 :(得分:1)
您只需要在dict值中循环跨越。让for-loop分裂它们会更好:
for row in reader:
snppos = row['snp_rein']
name = row['isoform']
if name in exons:
for low, high in exons[name]:
if low <= snppos <= high:
print name, low, high
break # Since exons can't overlap, go to next row immediately
如果您需要外显子列表中的索引而不是跨度(例如,索引2
而不是(70, 80)
),则添加enumerate
:
...
for i, (low, high) in enumerate(exons[name]):
if low <= snppos <= high:
print name, i
break
答案 1 :(得分:0)
如果您的词典中的列表已经订购,那么此方法将起作用
enumerate
方法提供两个输出,一个是索引,下一个是值。代码:
for sd, i in enumerate(exons[name]):
if snpos<=max(i) and snpos>=min(i):
print sd+1,name
break