我试图从文本文件中识别出一组在任何单个文本文件中出现至少一些次数的单词。我有一个列表来举行限定词。文件逐行读取。在每一行中,单词出现在行中,并且它们的计数被放入字典中。计数值高于阈值的单词将附加到列表中。在单行上运行的代码如下所示(我伪编码了一些与问题无关的部分):
words = []
candidates = {}
for line in text:
for word in line:
if word in dict:
candidates[word] += 1
else
candidates[word] = 1
for word in candidates:
if candidates[word] > threshold:
if word not in words:
words.append(word)
# candidates.clear()
在每一行的结尾处,我希望清空字典,而不是在其中携带无用的内容。但是,我现在放在#
之后的行:dict.clear()
将删除列表的内容,并且只在最后一行留下符合条件的单词。删除此行后,输出正确。
有人可以解释为什么会这样吗? list类的append()方法是否为数据的本地副本或仅维护指针?字典clear()方法是否不仅释放了dict对键值对的引用,还释放了其他对象对它们的引用?
@EDIT:为了解决一些注释,每行中的单词提取都是伪代码。我不认为这一步与问题有关。如果你们有兴趣,这是原始代码。 https://github.com/muyezhu/python/blob/master/freqword 该代码以长序列查找频繁发生的短DNA片段。可以通过以下链接下载示例数据:http://rosalind.info/problems/1d/
答案 0 :(得分:1)
使用链接数据集尝试链接代码表明您只获得kmers
的一组更新,因为最外面的for
循环只运行一次。
这是由于您使用的range
来电:range(range(0, len(genome) - L + 1, L - k)
。在示例数据中,len(genome)
为100
,L
为75
,k
为5
。这意味着您的范围为range(0, 26, 70)
,仅产生0
(下一个值为70
,远大于26
的上限。)
我很确定您不想将L - k
步骤参数提交给range
。如果您更改循环代码以使用range(len(genome) - L + 1)
,则会在kmers
中获得预期结果:['CGACA', 'GAAGA', 'AATGT']
。