繁体   English   中英

如何循环浏览字典列表并提取具有布尔值的键

[英]How to loop through dictionary list and extract one key with boolean value

我正在处理使用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'

我还使用“ tryexcept”来避免由于不完整的tweet引起的任何错误,但它返回的长度为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

解决此问题的最简单方法是执行以下操作:

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

使用具有内置错误检查功能的字典功能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))

如果您要列出未转发的推文列表,则实际上要在“ reweeted”为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))

Tweets的消费者应该容忍新字段的增加和字段顺序的变化。 并非所有字段都出现在所有上下文中。 通常将空字段,空集和不存在字段视为同一件事是安全的。 参考

所以你可以改变

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

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

在这种情况下,如果有一些推文没有转发,那么您将跳过它们。

如果您想收集所有未在单个列表中转发的推文:

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'推文(字典)也将被算作尚未转发的推文。 因此,只有明确包含'retweeted': True推文才会被转发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM