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

如何在python中删除列表中的所有成员,python,list,python-2.7,Python,List,Python 2.7,我正在读取包含单个数据的文件x。这些数据通过新行相互分隔。我想计算每个数据的tf_idf_vectorizer()。因此,每当代码出现新行(\n)时,我需要删除tweets的所有成员。我的代码中粗体行出现错误 def load_text(): file=open('x.txt', 'r') tweets = [] all_matrix = [] for line in file: if line in ['\n', '\r\n']:

我正在读取包含单个数据的文件x。这些数据通过新行相互分隔。我想计算每个数据的tf_idf_vectorizer()。因此,每当代码出现新行(\n)时,我需要删除tweets的所有成员。我的代码中粗体行出现错误

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

您可以通过一个简单的分配再次将
tweets
设置为空列表

tweets = []

您可以通过一个简单的分配再次将
tweets
设置为空列表

tweets = []
你应该。如果你想要一个新的空列表,只需创建一个

tweets = []
否则,您可能无法实际删除列表中的所有元素,我想您已经注意到了。

您应该这样做。如果你想要一个新的空列表,只需创建一个

tweets = []

否则,您可能无法实际删除列表中的所有元素,我想您可能已经注意到了。

如果您确实需要在适当的位置清空列表,您可以采用以下方式之一:

del tweets[:]
……或者

tweets[:] = []
通常,您可以通过这种方式删除或替换列表的任何子片
[:]
只是表示“整个列表”的子片段

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

tweets = []

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

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

其次,如果删除第一个元素,其他所有元素都会向上移动一个。因此,首先删除元素#0。然后,当您删除元素#1时,它不是原始元素#1,而是原始元素#2,它已上移了一个空间。除了跳过所有其他元素外,一旦跳过一半,您还将尝试删除列表末尾(新)的元素。一般来说,避免在遍历列表时对其进行变异;如果必须对其进行变异,那么只从右侧进行变异是安全的,而不是从左侧进行变异(正确操作仍然很棘手)

从左侧逐个删除元素的正确方法是:

while tweets:
    del tweets[0]
然而,这将是相当缓慢的,因为每次删除后您都必须重新调整列表。所以最好还是从右边走:

while tweets:
    del tweets[-1]

但是,正如上面所解释的,当你可以一次完成整个任务,或者甚至不去做它时,也不需要一个接一个地去做。如果你真的需要清空列表,那么你的方法是:

del tweets[:]
……或者

tweets[:] = []
通常,您可以通过这种方式删除或替换列表的任何子片
[:]
只是表示“整个列表”的子片段

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

tweets = []

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

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

其次,如果删除第一个元素,其他所有元素都会向上移动一个。因此,首先删除元素#0。然后,当您删除元素#1时,它不是原始元素#1,而是原始元素#2,它已上移了一个空间。除了跳过所有其他元素外,一旦跳过一半,您还将尝试删除列表末尾(新)的元素。一般来说,避免在遍历列表时对其进行变异;如果必须对其进行变异,那么只从右侧进行变异是安全的,而不是从左侧进行变异(正确操作仍然很棘手)

从左侧逐个删除元素的正确方法是:

while tweets:
    del tweets[0]
然而,这将是相当缓慢的,因为每次删除后您都必须重新调整列表。所以最好还是从右边走:

while tweets:
    del tweets[-1]

但是,正如上面所解释的那样,当您可以一次完成整个任务,或者甚至不必完成整个任务时,也无需逐一执行。

您还可以将代码重新编写为:

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]

这将文件分为非空行和空行。如果这些行不是空的,我们将从它们构建一个列表,以传递给列表comp中的矢量器。这意味着我们没有挂起对列表的引用,也没有在列表中一次添加一个引用。

您还可以将代码重新编写为:

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]

这将文件分为非空行和空行。如果这些行不是空的,我们将从它们构建一个列表,以传递给列表comp中的矢量器。这意味着我们没有对挂起的列表的引用,也没有在列表中一次添加一个引用。

您得到的错误的回溯是什么?您得到的错误的回溯是什么?我认为del tweets[:]比tweets[:]好。del的意图更加明确:删除;然而,后者说有些东西正在被取代