【问题标题】:Returning a dictionary with keys as words and the values as two-element lists返回一个字典,其中键作为单词,值作为二元素列表
【发布时间】:2021-08-14 10:33:33
【问题描述】:

返回一个字典,其键是单词,其值是双元素列表 [spam_count,non_spam_count],对应于我们在垃圾邮件和非垃圾邮件中看到的次数。我无法从下面的代码中理解以下内容。任何帮助都感激不尽! 这个声明是做什么的以及它背后的概念:counts[word][0 if is_spam else 1 ]+=1

from collections import defaultdict

def count_words(training_set):
    """TRAINING SET CONSISTS OF PAIRS (message,is_spam)"""
    counts=defaultdict(lambda:[0,0])
    for message,is_spam in training_set:
        for word in tokenize(message):
            counts[word][0 if is_spam else 1 ]+=1
    return counts

x=[('rain is great','data'),('morning','data'),
   ('lazy','creditcard'),('enjoy','mumbai')]
count_words(x)

import re

def tokenize(message):
    message=message.lower()
    all_words=re.split("\W+",message)
    return set(all_words)

【问题讨论】:

  • 那是什么语言?
  • @SL5net 在 Python 中
  • x中元组的第二个元素应该是bool,不是吗?
  • @AntonyHatchkins is_spam 包含一个被认为是垃圾邮件的特定单词,例如单词“creditcard”是垃圾邮件,包含在我们必须检查是否为垃圾邮件的邮件中。
  • 当你写 if is_spam 你暗示 is_spam 是布尔值。如果它是一个字符串,它将始终评估为True,除非该字符串为空。

标签: python dictionary conditional-operator


【解决方案1】:
  • counts -> 那是你的元组字典
  • counts[word] -> 这是[spam_count, non_spam_count] 形式的元组

现在,要访问此元组的组件,您可以:

spam_count, non_spam_count = counts[word]

但你也可以这样做:

spam_count = counts[word][0]
non_spam_count = counts[word][1]
  • 0 if is_spam else 1 -> 如果is_spam 为真,则计算为0,否则计算为1
  • counts[word][0 if is_spam else 1] -> 如果is_spam 为真,那么这是元组的第一个元素,即spam_count。否则,这是元组的第二个元素。
  • counts[word][0 if is_spam else 1] += 1 -> 如果is_spam 为真,则增加spam_count,否则增加non_spam_count

希望这对您来说已经足够了。

【讨论】:

    【解决方案2】:

    ternary conditional operator,同

    if is_spam:
        counts[word][0] += 1
    else:
        counts[word][1] += 1
    

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2021-05-19
      相关资源
      最近更新 更多