确定给定字典的位置,列表中包含列表

时间:2015-06-19 12:44:55

标签: python dictionary

我是新来的,我需要帮助处理一些我一直在努力的代码,因为我已经迷失了自己,现在只是感到困惑。

首先,我根据本网站的一些帮助创建了一个字典。我的字典样本如下:

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()函数,但我不确定我能否使用它。有什么建议吗?

2 个答案:

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

如果您的词典中的列表已经订购,那么此方法将起作用

  1. enumerate方法提供两个输出,一个是索引,下一个是值。
  2. 由于这里的值是list,我们正在遍历列表[一次一个列表]。
  3. 我们使用max方法查找列表的最大值
  4. 然后我们将它与文本中的值进行比较。
  5. 如果是这样,我们将打印索引+1和名称
  6. 代码:

    for sd, i  in enumerate(exons[name]):
        if snpos<=max(i) and snpos>=min(i):
            print sd+1,name
            break