使用 enumerate 遍历列表字典以提取信息

using enumerate to iterate over a dictionary of lists to extract information

今天早些时候,我得到了一些关于如何使用 enumerate() 从字典中获取位置信息的帮助。我将很快提供代码。但是,既然我已经找到了这个很酷的工具,我想以不同的方式实现它,以便从我的字典中获取更多信息。

我有字典:

length = {'A': [(0,21), (30,41), (70,80), (95,200)] 'B': [(0,42), (70,80)]..etc}

和一个文件:

A    73
B    15
etc

我现在要做的是找出我列表中第一个元素的最大值与第二个元素的最小值之间的差异。例如,21 和 30 的差异。然后我想将所有这些差异相加,直到我找到与我的文件中的数字匹配的数字对(范围)(如果有意义的话)。

这是我一直在处理的代码:

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]
            for sd, i  in enumerate(exons[name]):
                while not snpos<=max(i):
                    intron = min(i+1) - max(i) #this doesn't work unfortunately. It says I can't add 1 to i
                    totalintron = 0 + intron
                if snpos<=max(i):
                    exonmin = min(i)
                    exonnumber = sd+1
                    print exonnumber,name,totalintron
                    break

我认为是 sd(索引器)让我感到困惑。我不知道如何在此上下文中使用它。注释掉的部分是我尝试过但未能成功的其他途径。有什么帮助吗?我知道这是一个令人困惑的问题,我的代码可能有点混乱,但那是因为我什至无法获得输出来纠正我的其他错误。

根据提供的文件,我希望我的输出看起来像这样:

exon   name    introntotal    
3    A    38
1    B    0

问题是您错误地使用了 enumerate() 的输出。

enumerate() returns 索引(位置)在前,然后是项目

例如:

x = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
for i, item in enumerate(x):
    print(i, item)

# prints
#(0, 10)
#(1, 11)
#(2, 12)
#(3, 13)
#(4, 14)
#(5, 15)
#(6, 16)
#(7, 17)
#(8, 18)
#(9, 19)

所以在你的情况下,你应该切换 isd:

for i, sd in enumerate(exons[name]):
    # do something

像其他评论者建议的那样,阅读 python 文档通常是开始解决问题的好地方,尤其是当您不确定函数如何执行它的操作时:)

尝试为这个问题提供一些帮助:这个问题的一个关键部分是我不认为 enumerate 做了你认为它做的事情。枚举只是对您正在迭代的事物进行编号。因此,当您执行 for 循环时,sd 首先为 0,然后为 1……仅此而已。在您的情况下,您想查看相邻的列表条目(看起来?),因此 python 中更惯用的循环方式几乎没有那么干净。所以你可以这样做:

...
y = exons[name]

for index in range(len(y) - 1): # the - 1 is to prevent going out of bounds
    first_max = max(y[index])
    second_min = min(y[index+1])
    ... # do more stuff, I didn't completely follow what you're trying to do

我会为硬核 pythonistas 添加,您当然可以做一些聪明的事情来更地道地编写它并避免我编写的 C 样式循环,但我认为进入 zip 等等对于 python.

的新手来说可能有点困惑