【发布时间】:2017-07-28 16:54:09
【问题描述】:
我正在尝试保留一大组元组的前 k 个元素的列表。由于不可能将其保存在内存中,因此我想使用固定大小的列表来仅保留前 k 个值(使用键)。我曾尝试使用最小堆,但 python 的堆很糟糕,因为它允许插入非唯一键。这是一个巨大的问题。所以我想我可以使用排序列表/字典(具有唯一键的元组)。使用草图函数我检索子字符串在整个文本中出现的计数(O(1)时间))。我开始认为我在循环或弹出和分配方面做错了,因为 minheap 也有类似的问题,只有前 k 出现在 25 大小列表中,其余的计数相当低(当它在事实更高)
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
【问题讨论】:
-
很难解决你的问题,因为它并不完全清楚。您的代码引用代码外部的变量
sketch和topkmerdict。请阅读写minimal reproducible example 并相应地编辑问题。拥有适当的输入以及预期和实际输出将帮助您和其他所有人调试您的问题。我知道您说您阅读的内容超出了内存中的内容,但是您应该能够使用较小的数据集来测试该算法。将具有预期输出的最小数据集传递给我们,然后我们可以帮助您解决问题。 -
@ScottMermelstein 谢谢,我已经编辑添加了一个示例文件,文件读取部分代码并更改了草图函数以返回一个功能相似的随机数(返回 int 计数)。
-
你看过 heapq 它可能满足你的所有需求吗?
-
@paddyg 我做了,我也有一个我做 min heap 的版本,但问题是,与 set 或 dict 不同,heapq 允许一遍又一遍地添加非唯一项(因为我的键是子字符串,我有很多)。
标签: python loops sorting sortedlist min-heap