【问题标题】:using enumerate to iterate over a dictionary of lists to extract information使用 enumerate 遍历列表字典以提取信息
【发布时间】:2015-06-19 18:01:02
【问题描述】:

今天早些时候我得到了一些关于如何使用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

【问题讨论】:

  • 我想在 python 上做得更好。我应该只阅读在线发布的手册吗?我觉得我太挣扎了。
  • 是的,您确实应该阅读手册(official Python tutorial)。
  • 我建议您将问题简化为特定的代码示例,并将该代码与示例输入一起发布到此处;输出和期望的输出。
  • 如果您经常需要使用列表进行计算(例如您的intron = min(i+1)...),请考虑使用numpy。当然,首先阅读tutorial

标签: python dictionary enumerate


【解决方案1】:

尝试为这个问题提供一些帮助:问题的一个关键部分是我不认为 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 新手。

【讨论】:

  • 啊,是的。我想我需要加入这样的东西!非常感谢:)
  • 我正在尝试将其合并到我的代码中。但是,我认为for index in range(len(y)-1) 将对与名称关联的列表的整个长度执行以下功能。我可以在该行之后使用if snpos &lt;=max(index): 仅在列表中建立索引,直到 snpos
  • 如果我了解如何防止在整个列表中进行差异计算,那么我想我可以解决其他所有问题。
【解决方案2】:

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

enumerate() 先返回索引(位置)然后返回项目

例如:

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 文档通常是开始解决问题的好地方,特别是如果你不确定一个函数是如何做的:)

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2017-05-07
    • 2019-11-29
    相关资源
    最近更新 更多