我正在迭代一个字符串,将其转换为不同的数据结构;它是一个对象字典,其中键是主字符串中当前位置的k长度子字符串,该值是一个对象,它计算主字符串“frames”中该子字符串的出现次数(即L-长度子串)。我只保留一个特定阈值的计数,一旦过去,该密钥就会被添加到最终返回的存储桶中。
class kmerRecord:
_inFrames = {}
_threshold = None
reachedThreshold = False
def __init__(self, threshold, inFrames = []):
self._threshold = threshold
if inFrames:
self.incrementFrames(inFrames)
# Debug
def __repr__(self):
return '<in: ' + str(self._inFrames) + ', t: ' + str(self.reachedThreshold) + '>'
def incrementFrames(self, inFrames):
if not self.reachedThreshold:
for f in inFrames:
if f in self._inFrames:
self._inFrames[f] += 1
if self._inFrames[f] >= self._threshold:
self.reachedThreshold = True
break
else:
self._inFrames[f] = 1
def kmerClump(data, k, L, t):
kmers = {}
found = []
N = len(data)
for i in range(N - k + 1):
kmer = data[i : i + k]
inFrames = range(max(0, i - L + k), min(i, N - L) + 1)
if kmer in kmers:
kmers[kmer].incrementFrames(inFrames)
else:
kmers[kmer] = kmerRecord(t, inFrames)
# Debug
# print kmer, min(inFrames), max(inFrames), kmers
if kmers[kmer].reachedThreshold:
found.append(kmer)
return found
据我所知,我的代码正在做我上面所描述的。但是,它不起作用,当我尝试输出字典和对象时,看起来好像字典中的每个对象都是相同的:好像实际上只有一个对象而其他键值只是对它的引用,而不是不同的对象。我是否在某个地方弄错了语义,还是有其他问题?