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

こいつは効きそうだな…

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 に答える
0

データのサイズが妥当な場合は、以前に他の人が提案したように、フィルター処理されたリストの理解をお勧めします

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

OTOH、リストが大きく、削除したい欠陥のあるアイテムがほんの数個である場合、に基づくアプローチ.remove()がより高速であり、大きな新しいリストを作成する中間ステップを回避できる可能性があります

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

別のアプローチをとるのに適しているかもしれません

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