将文件中的元素匹配到嵌套字典python

时间:2015-04-19 16:39:07

标签: python dictionary

在我提出问题之前,我想向你们提供我迄今为止所拥有的内容。

首先,我从一个我想用来比较的文件中生成了一个嵌套字典。我的字典看起来像一个例子如下图所示(唯一的区别是大小):

Negdic = {'ADA': {'NM_000022': ['43248162', '43248939',
                                '43249658', '43251228',
                                '43251469', '43251647',
                                '43252842', '43254209',
                                '43255096', '43257687',
                                '43264867', '43280215', '']},
          'ALDOB': {'NM_000035': ['104182841', '104187124',
                                  '104187734', '104188836',
                                  '104189763', '104190750',
                                  '104192036', '104193057',
                                  '104197990', '']}}

现在,由于我不熟悉Python并且不熟悉编程,所以这就是我在苦苦挣扎的地方。我想使用第二个文件在我的字典中搜索匹配项。我的文件看起来如此:

chrom   exon_start  exon_end    strand  isoform exon_numer  gene    coding_length   total_mutations_reported    total_exonic_mutations  exonic_splicing_mutations   total_splice_site_mutations 3_ss_mutations  5_ss_mutations
chr20   43255096    43255240    -   NM_000022   4   ADA 144 12  9   0   3   3   0
chr9    104187734   104187909   -   NM_000035   7   ALDOB   175 7   4   0   3   2   1

我想要做的是在我的字典中搜索基因名称,然后匹配同种型名称,然后最后搜索exon_start的相应同种型列表,并在列表中找到找到exon_start的位置。< / p>

以下是我一直试图使用的一些示例代码,但我不确定我是否在正确的轨道上。

for line in open("NegativeHotspot.txt"):
    columns = line.split('\t')
    if len(columns) >= 2:
        Hotspotgenes = columns[6]
        Hotspotgenes2 = Hotspotgenes.split()
        print Hotspotgenes2


#print Hotspotgenes2
#x = type(Hotspotgenes)
#print x
#for k in Hotspotgenes:
#    if k in Negdic:
#        print k, Negdic[k] 

第一部分是我一直在努力创建文件中的基因列表以搜索字典中的结果,但是我甚至都在努力甚至根据列的输出创建列表[ 6]。另外,我甚至不确定我是否以最佳方式处理我的代码。该编码部分的最后一部分是我在试图在我的字典中找到匹配时所乱搞的东西。

非常感谢帮助。我迷路了:(

2 个答案:

答案 0 :(得分:1)

我会尽力让你走上正确的轨道并指出一些对你未来有用的事情。打开文件时,最好使用“with”参数,因为这样会在您完成后为您关闭文件。所以做一些像:

with open('eggs.csv', 'rb') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print ', '.join(row)

那个人正在做的是创建一个Python生成器。在不详细说明的情况下,您需要记住,使用生成器时,您只能遍历对象一次。所以它不像遍历列表或字典。因此,如果您想搜索其他内容,则可能需要再次运行所有文件。要解决这个问题,您可以将数据保存到一个更有用的对象中,例如列表列表,其中每行都是一个列表,然后您的所有文件都是这些列表的列表。

然后,您可以创建标题并将列表解析为可以索引的字典。所以,如果我有一个类型的csv:

fruits, vegetables, cars
banana, cucumber, audi

一个选项是拥有一个字典列表,所以每一行看起来像: {'fruits':'banana','vegetables':'cucumber',...}。因此,这最好是索引,但可能不像列表列表那样紧凑。最后,我建议您记住每个对象在Big O中的表现如何,因为如果您的数据集很大,它会有所不同。

字典的问题在于它们很适合搜索它们的键,但是如果你想在我向你展示的例子中搜索香蕉,它就不会有效。您将不得不遍历整个数据,查找带有香蕉的dict作为值。

答案 1 :(得分:1)

您有一个以制表符分隔的值文件,因此您应该使用专用于分隔文件格式的模块csv

import csv

您还有包含有意义名称的标题。执行row[header_name]row[col_number]更容易理解,所以让我们使用csv.DictReader

with open("NegativeHotspot.txt") as f:
    reader = csv.DictReader(f, delimiter="\t")

现在我们可以遍历reader的每一行,并使用list.index方法提取您需要的信息

    for row in reader:
        gene, isoform = row['gene'], row['isoform']
        count = Negdic[gene][isoform].index(row['exon_start'])

您永远不会说出count变量的最终结果,但count现在是exon_start词典中出现Negdic[gene][isoform]的索引。