我正在读取包含个人数据的文件x。这些数据通过换行相互分开。我想为每个单独的数据计算tf_idf_vectorizer()。因此,每当代码精细换行(\ n)时,我都需要删除推文的所有成员。我的代码中的粗体行出错了。
def load_text():
file=open('x.txt', 'r')
tweets = []
all_matrix = []
for line in file:
if line in ['\n', '\r\n']:
all_matrix.append(tf_idf_vectorizer(tweets))
**for i in tweets: tweets.remove(i)**
else:
tweets.append(line)
file.close()
return all_matrix
答案 0 :(得分:3)
您可以通过简单的作业再次将tweets
设为空列表。
tweets = []
答案 1 :(得分:2)
如果您确实需要就地清空列表,那么您的方法是:
del tweets[:]
......或......
tweets[:] = []
通常,您可以这种方式删除或替换列表的任何子列表; [:]
只是表示“整个列表”的子标题。
但是,由于没有其他人可以引用tweets
,因此没有理由清空列表;只需创建一个新的空列表,并将tweets
绑定到该列表,并让旧列表变为垃圾清理:
tweets = []
无论如何,这有两个大问题:
for i in tweets: tweets.remove(i)
首先,当您要删除特定元素时,不应使用remove
。这必须搜索列表以找到匹配元素 - 这是浪费的(因为您已经知道您想要哪一个),如果您有任何重复项也可能不正确(同一元素可能有多个匹配项)。而是使用索引。例如,del tweets[index]
。您可以使用enumerate
函数来获取索引。对于许多其他列表,字符串等函数也是如此 - 当您可以直接获取索引时,请不要使用index
,find
等等。
其次,如果删除第一个元素,其他所有元素都会向上移动一个元素。所以,首先删除元素#0。然后,当您删除元素#1时,它不是原始元素#1,而是原始#2,它已向上移动了一个空格。除了跳过所有其他元素,一旦你完成了一半,你就试图删除列表中(新)结尾的元素。通常,避免在迭代列表时改变列表;如果你必须改变它,那么从右边而不是左边这样做是安全的(而且要做到这一点仍然很棘手)。
从左侧逐个删除元素的正确方法是:
while tweets:
del tweets[0]
然而,这将非常缓慢,因为您必须在每次删除后重新调整列表。所以从右边开始仍然更好:
while tweets:
del tweets[-1]
但是,如上所述,当你可以一次完成所有事情,或者甚至不做时,就没有必要一个接一个地去。
答案 2 :(得分:1)
你应该never try to remove items from a list while iterating over that list。如果你想要一个新的空列表,只需创建一个。
tweets = []
否则你可能实际上并没有删除列表中的所有元素,因为我怀疑你注意到了。
答案 3 :(得分:0)
您还可以将代码重新设置为:
from itertools import groupby
def load_tweet(filename):
with open(filename) as fin:
tweet_blocks = (g for k, g in groupby(fin, lambda line: bool(line.strip())) if k)
return [tf_idf_vectorizer(list(tweets)) for tweets in tweet_blocks]
这会将文件分组为非空行和空行。在行不为空的情况下,我们从它们构建一个列表以传递给list-comp中的向量化器。这意味着我们没有引用列表,也没有一次一个地添加到列表中。