【问题标题】:How to find a word - First letter will be capital & other will be lower如何查找单词 - 第一个字母大写,其他小写
【发布时间】:2025-12-16 10:50:02
【问题描述】:

问题陈述:从完整的 text6 集中过滤那些单词,第一个字母大写,所有其他字母小写。将结果存储在变量 title_words 中。打印 title_words 中存在的单词数。

我已经尝试了所有可能的方法来找到答案,但不知道我在哪里落后。

import nltk
from nltk.book import text6
title_words = 0
for item in set(text6):
    if item[0].isupper() and item[1:].islower():
        title_words += 1
print(title_words)

我也试过这种方式:

title_words = 0
for item in text6:
    if item[0].isupper() and item[1:].islower():
        title_words += 1
print(title_words)

我不确定它需要多少计数,无论计数如何,它都不允许我通过挑战。如果我在这段代码中做错了什么,请告诉我

【问题讨论】:

  • 你试过打印出set(text6)中的一些items吗?如何打印其中的一些以及您的if 条件是真还是假。 Control+C 并手动查看它,看看它的行为是否符合您的预期。 (那些只是标点符号的词呢?)
  • @khelwood, :( 我试图将这些项目附加到列表中并手动检查列表但它不起作用。我的代码有什么问题还是我遗漏了一些重要的东西?

标签: python python-3.x nlp


【解决方案1】:

上述建议之一确实对我有用。示例代码如下。

title_words = [word for word in text6 if (len(word)==1 and word[0].isupper()) or (word[0].isupper() and word[1:].islower()) ]
print(len(title_words))

【讨论】:

  • 您所说的“以上建议”是什么意思?您的回答中没有任何内容。
【解决方案2】:

我认为问题出在set(text6)。我建议你遍历text6.tokens

更新、说明

您提供的代码是正确的。

问题是文本可以包含多次相同的单词。执行set(words) 会减少可用词的总数,因此您从不完整的数据集开始。

其他响应在检查单词的有效性时不一定是错误的,但它们正在迭代相同的错误数据集。

【讨论】:

  • @Lucifer 我已经用解释更新了答案。希望对你有帮助! :)
【解决方案3】:

在问题中,“将结果存储在变量 title_words 中。打印 title_words 中存在的单词数。”

过滤一个元素列表的结果是一个相同类型元素的列表。在您的情况下,过滤列表 text6 (假设它是一个字符串列表)将导致一个(较小的)字符串列表。你的title_words 变量应该是这个过滤列表,而不是字符串的数量;字符串的数量就是列表的长度。

如果大写单词应该过滤掉(即从较小的列表中删除)还是过滤(即保留在列表中),这个问题也很模糊,所以试试两者,看看你是否解释错了。

【讨论】:

    【解决方案4】:

    试试正则表达式:

    >>> import re
    >>> from nltk.book import text6
    >>>
    >>> text = ' '.join(set(text6))
    >>> title_words = re.findall(r'([A-Z]{1}[a-z]+)', text)
    >>> len(title_words)
    461
    

    【讨论】:

    • 感谢@constt 的持续努力和更新。欣赏它。但它仍然没有通过挑战。相信我,我在没有任何编辑的情况下复制粘贴了挑战。总之谢谢
    【解决方案5】:

    text6 中有 50 个单例元素(长度为 1 的元素),但是,您的代码不会通过任何成功,例如“I”或“W”等。这是正确的,还是您需要最小长度 2?

    【讨论】:

    • :( 也尝试过 len(item) > 1 或 2 但仍然没有帮助。有时我认为放弃更好。:) 从我尝试的很多天开始,今天我尝试了这里的所有人,但它没有通过。 :) 谢了,兄弟。我现在要放弃了。
    • 您是否尝试包含所有长度为 1 且也是大写的单词?不过,如果您继续前进,请不要担心。
    【解决方案6】:

    根据问题的要求进行少量更改。

    from nltk.book import text6
    title_words = []
    for item in set(text6):
        if item[0].isupper() and item[1:].islower():
            title_words.append(item)
    print(len(title_words))
    

    【讨论】:

      【解决方案7】:

      试试这个:

      title_words = [ word for word in text6 if word.istitle()]
      
      print(len(title_words))
      

      【讨论】: