0
  • 我有一个列表,名为 tweets_data
  • 列表的每个元素都是一个字典
  • 字典的键是“文本”
  • 但是原始数据缺少一些“文本”

这就是为什么,我想删除缺少文本的字典。这就是我的代码的样子:

for i in range(len(tweets_data)):
    try:
        print tweets_data[i]['text']
    except KeyError:
        tweets_data.remove(tweets_data[i])
        i += 1

我收到这样的错误:

IndexError: list index out of range

我的问题:是否可以用更聪明的方式从我的列表中删除丢失的数据,这样我就不会收到这样的错误?提前谢谢!

4

4 回答 4

2

在迭代列表时,不能在不混淆索引的情况下从列表中删除项目。每次删除时,列表都会变短 - 但您仍在计算原始列表的长度并期望在那里找到元素。

试试这个:

ok_tweets = [x for x in tweets_data if 'text' in x]
于 2015-04-08T21:27:18.677 回答
0

可能适合您采用不同的方法

new_tweet_data = [tweet for tweet in tweet_data if 'text' in tweet]
于 2015-04-08T21:26:58.953 回答
0

如果您的数据大小合理,我建议您使用过滤列表理解,正如其他人之前所建议的那样

filtered = [tweet for tweet in tweets_data if 'text' in tweet]

OTOH,如果您的列表很大,而您想要删除的有缺陷的项目只是少数,那么基于的方法.remove()可能会更快,从而避免创建 LARGE 新列表的中间步骤

delenda = [defective for defective in tweet_data if 'text' not in defective]
for tweet in delenda: tweeets_data.remove(tweet)

请注意,每个.remove()人都必须扫描整个列表,因此这种方法可能仅对极少数要删除的项目具有竞争力

如果您需要根据这个问题交付产品,我衷心建议您使用数据样本来安排不同的方法

阅读https://wiki.python.org/moin/TimeComplexity在物种

在内部,列表表示为数组;最大的成本来自超出当前分配大小的增长(因为所有内容都必须移动),或者来自在开始附近的某处插入或删除(因为之后的所有内容都必须移动)。

我已经删除了我之前的答案,建议使用.remove()来避免复制可能很大的列表,因为事实证明,.remove()实际上,每个都在复制列表的很大一部分。

正确的做法确实是列表理解。

于 2015-04-08T21:51:33.270 回答
0

我想这个可行...

cleandata=[]
for i in range(len(tweets_data)):
    try:
        print tweets_data[i]['text']
        cleandata.append(tweets_data[i]['text'])
    except KeyError:
        i += 1
于 2015-04-08T21:51:12.753 回答