如何删除python中列表的所有成员

时间:2013-12-11 21:00:00

标签: python list python-2.7

我正在读取包含个人数据的文件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

4 个答案:

答案 0 :(得分:3)

您可以通过简单的作业再次将tweets设为空列表。

tweets = []

答案 1 :(得分:2)

如果您确实需要就地清空列表,那么您的方法是:

del tweets[:]

......或......

tweets[:] = []

通常,您可以这种方式删除或替换列表的任何子列表; [:]只是表示“整个列表”的子标题。

但是,由于没有其他人可以引用tweets,因此没有理由清空列表;只需创建一个新的空列表,并将tweets绑定到该列表,并让旧列表变为垃圾清理:

tweets = []

无论如何,这有两个大问题:

for i in tweets: tweets.remove(i)

首先,当您要删除特定元素时,不应使用remove。这必须搜索列表以找到匹配元素 - 这是浪费的(因为您已经知道您想要哪一个),如果您有任何重复项也可能不正确(同一元素可能有多个匹配项)。而是使用索引。例如,del tweets[index]。您可以使用enumerate函数来获取索引。对于许多其他列表,字符串等函数也是如此 - 当您可以直接获取索引时,请不要使用indexfind等等。

其次,如果删除第一个元素,其他所有元素都会向上移动一个元素。所以,首先删除元素#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中的向量化器。这意味着我们没有引用列表,也没有一次一个地添加到列表中。