Python list append()的奇怪行为
我试图从一个文本文件中识别一组单词,这些单词在任何一个文本文件中至少出现了若干次。我有一张保留限定词的列表。文件逐行读取。在每一行中,出现在该行中的单词及其计数都被放入词典中。计数数大于阈值的单词将追加到列表中。在单行上运行的代码如下所示(我对一些与问题无关的部分进行了伪编码): 在每一行的结尾,我都希望清空字典,不要在字典里放无用的内容。但是,我现在在Python list append()的奇怪行为,python,list,dictionary,Python,List,Dictionary,我试图从一个文本文件中识别一组单词,这些单词在任何一个文本文件中至少出现了若干次。我有一张保留限定词的列表。文件逐行读取。在每一行中,出现在该行中的单词及其计数都被放入词典中。计数数大于阈值的单词将追加到列表中。在单行上运行的代码如下所示(我对一些与问题无关的部分进行了伪编码): 在每一行的结尾,我都希望清空字典,不要在字典里放无用的内容。但是,我现在在#后面放的那一行:dict.clear()会删除列表的内容,并在最后一行中只保留限定词。当这一行被删除时,输出是正确的 有人能解释一下为什么会这
#
后面放的那一行:dict.clear()
会删除列表的内容,并在最后一行中只保留限定词。当这一行被删除时,输出是正确的
有人能解释一下为什么会这样吗?list类的append()方法是本地复制数据还是只维护一个指针?dictionary clear()方法是否不仅释放dict对键值对的引用,而且释放其他对象对键值对的引用
@编辑:为了处理一些注释,每行中的单词提取都是伪代码。我认为这一步与问题无关。如果你们感兴趣,这里是原始代码。
该代码查找长序列中频繁出现的短DNA片段。示例数据可通过此链接下载:使用链接数据集尝试链接代码表明,您只获得一组对
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']
使用python关键字作为变量不是一个好主意。我的意思是,你不应该使用list
和dict
作为变量。dict
对象和list
对象除了不可变的字符串对象之外没有任何共同点。请检查你是否正在执行类似list=[]
在代码中的某个地方,或者提供最小的可复制示例。很抱歉,原始代码没有列表
和dict
作为变量。在这里犯了一个愚蠢的错误。此外,使用for循环迭代字符串将在每次迭代中给出单个字符,而不是单词。我不明白为什么要删除该措辞在每一行的末尾加上一个ary。可能您希望计算多行中的单词以达到阈值。如果您试图提高效率,那么您肯定不希望每一行都遍历字典。此伪代码将很难确定出现了什么问题。
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()