2017-03-23 12 views
0

私はStreaming APIを使用して収集されたTwitterデータに取り組んでおり、リツイートされたすべてのつぶやきを削除しようとしていました。私のデータセット内 単一の項目は次のようになります。辞書リストをループしてブール値でキーを抽出する方法

tweets_data[5] 

{'contributors': None, 
'coordinates': None, 
'created_at': 'Thu Mar 09 15:14:10 +0000 2017', 
... ... 
'retweet_count': 0, 
'retweeted': False, 
... ...} 

そして、私は仕事をするためにループを書いた:

tweets_Rt_Removed = [] 
for tweet in tweets_data: 
    if tweet['retweeted'] == True: 
     tweets_Rt_removed.append(tweet) 

print(len(tweets_Rt_Removed)) 

しかし、それは私にこのようなエラーました:

KeyError         Traceback (most recent call last) 
<ipython-input-32-d44896eca6fd> in <module>() 
     4 
     5 for tweet in tweets_data: 
----> 6  if tweet['retweeted'] == True: 
     7   tweets_Rt_removed.append(tweet) 
     8 

KeyError: 'retweeted' 

また、「try except」を使用して、不完全なつぶやきに起因するエラーを回避しますが、長さは0に戻ります。

これはブール値によるエラーですか? 何か助けに感謝します!

+1

retweetedは常に存在しますか? – Artagel

+0

また、== Trueを行う必要はありません。 tweet ['retweeted]:本当に評価された場合 – Artagel

+0

あなたがリツイートしたすべてのつぶやきを削除しようとしているのか、それを集めようとしているのですか?このようにして、それらを収集しています... – coder

答えて

0

ラップ

if tweet['retweeted'] == True: 
     tweets_Rt_removed.append(tweet) 

try: 
    if tweet['retweeted']: # Will throw a key error if it doesn't have a retweet 
     tweets_Rt_removed.append(tweet) 
except KeyError: 
    pass # No retweeted == good 
+0

ありがとう!これは機能します。 "KeyError:Pass"を除く。私は何も返さなかった "except:continue"と書いた。 – Daisywang

+0

@Daisywangは、ループの最後に 'continue'を有効に' pass'する必要があります...しかし、私はあなたのために働いてうれしいです。 – TemporalWolf

+0

あなたが実際に確認できるものを渡すことを除いて試してみると私には分かりません:) – Artagel

0

これをトラブルシューティングするための最も簡単な方法はこれを行うことです:あなたはトレースバックを取得すると

tweets_Rt_Removed = [] 
for tweet in tweets_data: 
    try: 
     if tweet['retweeted']: # no == True necessary 
      tweets_Rt_removed.append(tweet) 
    except: 
     import pdb;pdb.set_trace() 

、それはに行きますよpdbと入力すると、tweet

これは特定のつぶやきの内容を表示し、あなたのキーがあるかどうかを見ることができます。

それがない場合、その後、あなたはそれが存在する場合、最初のを確認する必要があります。

if 'retweeted' in tweet: 
    do your stuff 
0

内蔵のエラーチェックがあり、ケースのデフォルト値を提供可能に辞書機能getを使用します一部の値ではキーは存在しません。あなたが「リツイート」のすべてのつぶやきを追加したい、実際と思い

tweets_Rt_Removed = [] 
for tweet in tweets_data: 
    if tweet.get('retweeted', default=False): 
     tweets_Rt_removed.append(tweet) 

print(len(tweets_Rt_Removed)) 

あなたがリツイートされていないツイートのリストを作成しようとしている場合は、Falseです:

tweets_Rt_Removed = [] 
for tweet in tweets_data: 
    if not tweet.get('retweeted', default=False): 
     tweets_Rt_removed.append(tweet) 

print(len(tweets_Rt_Removed)) 
0

Consumers of Tweets should tolerate the addition of new fields and variance in ordering of fields with ease. Not all fields appear in all contexts. It is generally safe to consider a nulled field, an empty set, and the absence of a field as the same thing. Reference

だから、

012に

if tweet['retweeted'] == True: 
    tweets_Rt_removed.append(tweet) 

を変更することができます

この場合、返信されたフィールドのないつぶやきがある場合は、スキップします。

+1

'true 'は必要ありません。 –

+0

PEP 285によれば、True、False、Noneはシングルトンです。 変数がブール値で、値がTrueであることを確認するには、is演算子を使用します。 xが "False"(または空でない文字列、空でないリスト、タプル)の場合、x:の条件はTrueとみなされます したがって、is演算子を使用するのはpythonicで正しい方法です "Explicit " –

+1

@FarhadMaleki最終的にそれは文体的な選択ですが、私はjuanpaに同意します - 特にブール値(OPが示すように)の場合、' value: 'が一般的に受け入れられる方法です – TemporalWolf

0

あなたは、単一のリストにリツイートされていないすべてのツイートを収集したい場合:

not_retweeted = [t for t in tweets_data if not t.get('retweeted', False)] 

それとものみリツイートされた:

retweeted = [t for t in tweets_data if t.get('retweeted', False)] 

をこれはtweets_dataがリストであることを前提としてい項目として辞書を含む。

また、'retweeted'のキーがないツイート(辞書)は、リトライされていないツイートとしてカウントされます。したがって、明示的に'retweeted': Trueを含むつぶやきのみがリツイートされたとみなされます。

関連する問題