如何遍历字典列表并使用布尔值提取一个键

时间:2017-03-23 19:34:59

标签: python api twitter

我正在处理使用Streaming API收集的Twitter数据,并试图删除所有转发的推文。 我的数据集中的单个项目如下所示:

defer

我写了一个循环来完成这项工作:

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))

我也使用“try except”来避免由不完整的推文引起的任何错误,但它返回的长度为0.

这是由布尔值引起的错误吗? 任何帮助表示赞赏!

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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))

如果您正在尝试列出尚未转发的推文列表,您实际上想要将所有推文附加到"转发的"是假的:

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))

答案 3 :(得分:0)

  

推文的消费者应该容忍添加新字段和   方便排序的方差。并非所有字段都出现   上下文。考虑一个空的字段通常是安全的   设置,并且没有字段是同一件事。Reference

所以你可以改变

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

if tweet.get('retweeted', False) is True:
    tweets_Rt_removed.append(tweet)

在这种情况下,如果有一些没有转推字段的推文,您将跳过它们。

答案 4 :(得分: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的推文才会被视为转发。