运行 已排序的固定大小列表中的前 k 个元素/python
Running top k elements in a sorted, fixed size list / python
我正在尝试保留一大组元组的前 k 个元素的列表。由于将它保存在内存中是不可能的,我想使用一个固定大小的列表来只保留前 k 个值(带有键)。我曾尝试使用最小堆,但 python 的堆很糟糕,因为它允许插入非唯一键。这是个大问题。所以我想我可以使用排序的 list/dict 代替(具有唯一键的元组)。使用草图函数,我检索子字符串在整个文本中出现的计数(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
请尝试更改线路:
kmerMin = (sorted(topkmerdict,reverse = False, key=lambda x: x[1]))
至:
kmerMin = (sorted(topkmerdict,reverse = False)
上一行仅对字符串键值的第二个字符进行排序。
我正在尝试保留一大组元组的前 k 个元素的列表。由于将它保存在内存中是不可能的,我想使用一个固定大小的列表来只保留前 k 个值(带有键)。我曾尝试使用最小堆,但 python 的堆很糟糕,因为它允许插入非唯一键。这是个大问题。所以我想我可以使用排序的 list/dict 代替(具有唯一键的元组)。使用草图函数,我检索子字符串在整个文本中出现的计数(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
请尝试更改线路:
kmerMin = (sorted(topkmerdict,reverse = False, key=lambda x: x[1]))
至:
kmerMin = (sorted(topkmerdict,reverse = False)
上一行仅对字符串键值的第二个字符进行排序。