【问题标题】:Python KeyError DictionaryPython KeyError 字典
【发布时间】:2015-04-08 21:23:01
【问题描述】:
  • 我有一个名为 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

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

【问题讨论】:

  • 你知道错误是什么意思吗?
  • 您不能在迭代列表时从列表中删除项目而不会混淆索引!每次删除时,列表都会变短 - 但您仍在计算原始列表的长度,并希望在那里找到元素。
  • @Ben 在迭代范围时仍然是这种情况吗?不超过列表本身
  • 问题在于range 与原始list 匹配,但它被应用于缩小的list
  • 是的——因为对于一个 10 元素的列表,你仍然会尝试在索引 9 处查找元素,即使你已经删除了一半的列表——所以你会得到一个 IndexError。

标签: python list dictionary missing-data keyerror


【解决方案1】:

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

试试这个:

ok_tweets = [x for x in tweets_data if 'text' in x]

【讨论】:

    【解决方案2】:

    可能适合你有不同的方法

    new_tweet_data = [tweet for tweet in tweet_data if 'text' in tweet]
    

    【讨论】:

      【解决方案3】:

      我猜这个可行...

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

      【讨论】:

      • @Tim,很抱歉让你一直编辑我的代码.. 我不知道怎么做.. 不过谢谢..
      【解决方案4】:

      如果您的数据大小合理,我建议您按照其他人之前的建议进行过滤列表理解

      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() 实际上都在复制列表的很大一部分。

      正确的做法确实是列表推导。

      【讨论】:

      • 谢谢!你们太棒了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多