2017-07-28 76 views
2

我试图保留大量元组集合的顶部k个元素的列表。由于将它保存在内存中是不可能的,因此我想使用固定大小的列表来仅保留最高k值(使用键)。我试图使用min堆,但python的堆非常糟糕,因为它允许插入非唯一键。这是一个巨大的问题。所以我想我可以使用排序列表/代词(带有唯一键的元组)。使用草图函数我检索子字符串在整个文本中出现的计数(O(1)time))。我开始认为我在循环或弹出窗口和赋值方面做了一些错误,因为minheap也有类似的问题,其中只有顶部k出现在25大小的列表中,其余的都是相当低的数量(当它处于实际上更高)在排序的固定大小列表中运行顶部k个元素/ python

for line in lines[1::4]: 

    startIdx = 0 
    while startIdx + k <= (len(line)-k): 
     kmer = line[startIdx:(startIdx+k)] 
     count = randint(1, 250) 

     if count > 2: 
      if len(tdict.keys()) < topcount: 
       tdict[km] = count 
      else: 
       kMin = (sorted(tdict,reverse = False, key=lambda x: x[1])) 
       if count > tdict[kMin[0]]: 
        topkmerdict.pop(kMin[0]) 
        topkmerdict[km] = count 
     startIdx += 1 

    linesProcessed += 1 
+0

很难解决你的问题,因为它不是很清楚。您的代码引用代码外部的变量'sketch'和'topkmerdict'。请仔细阅读[mcve]并相应编辑问题。具有适当的输入以及预期和实际输出将有助于您和其他人调试您的问题。我知道你说你阅读的内容比内存中的内容多,但你应该可以用较小的数据集来测试算法。将最小数据集传递给我们,并输出预期结果,然后我们可以帮助您解决问题。 –

+0

@ScottMermelstein谢谢,我已编辑添加示例文件,文件读取代码部分并更改了草图函数以返回一个随机数,该函数的作用类似(返回int数)。 – dusa

+0

你看了heapq它可能会做你需要的一切吗? – paddyg

回答

1

。请尝试更改行:

kmerMin = (sorted(topkmerdict,reverse = False, key=lambda x: x[1])) 

到:

kmerMin = (sorted(topkmerdict,reverse = False) 

前一行只选对字符串键v的第二个字符alues。

相关问题