【问题标题】:Comparing variables to all items in list in Python将变量与Python中列表中的所有项目进行比较
【发布时间】:2017-03-22 22:07:46
【问题描述】:

我需要为 edx Python 课程编写一个函数。这个想法是计算出一系列字符串中的字母和单词的数量,并在仅使用 for/while 循环和条件时返回平均字母数。我的代码接近能够做到这一点,但我不能。为了我的一生。弄清楚为什么它不起作用。我已经用头撞了两天了,现在,我知道这可能是一件非常简单的事情,我太白痴了(感觉到我的挫败感?),但我不知道它是什么。

如果我正在查看第 14 行,逻辑是有道理的:如果字符串中的 i 是标点符号(不是一个字母)并且前一个字符(在本例中为 char)不是标点符号(因此是字母),它应该是一个单词。但它仍然把双标点算作单词。但不是全部

def averageWordLength(myString):
    char = ""
    punctuation = [" ", "!", "?", ".", ","]
    letters = 0
    words = 0
    if not myString == str(myString):
        return "Not a string"
    try:
        for i in myString:
            if i not in punctuation:
                letters += 1
            elif i in punctuation:
                if char not in punctuation:
                    words += 1
                elif char in punctuation:
                    pass
            char = i

        if letters == 0:
            return "No words"
        else:
            average = letters / (words + 1)
            return letters, words + 1, average
    except TypeError:
        return "No words"
print(averageWordLength("Hi"))
print(averageWordLength("Hi, Lucy"))
print(averageWordLength("   What   big spaces  you    have!"))
print(averageWordLength(True))
print(averageWordLength("?!?!?! ... !"))
print(averageWordLength("One space. Two spaces.  Three spaces.   Nine spaces.         "))

期望的输出:

2, 1, 2.0
6, 2, 3.0
20, 6, 4.0
Not a string
No words
38, 8, 4.75

我到底做错了什么?!

٩๏̯͡๏۶

最终修正:

for i in myString:
    if i not in punctuation:
        letters += 1
        if char in punctuation:
            words += 1
    char = i

【问题讨论】:

  • 您希望这些打印语句的输出是什么?
  • 输出应该是:2.0, 3.0, 4.0, Not a string, No words, 4.75
  • 顺便说一句,有很多代码可能会抛出错误,您将它们包装在单个 try 块中。你应该尽量缩小范围。
  • 我最近一直在放弃优雅,而不是试图通过我的显示器无聊我的 头脑 来强迫它工作,但你是绝对正确的。跨度>
  • 在上面发布了我的解决方案。感谢所有帮助我了解我做错了什么的伟大人物!

标签: python


【解决方案1】:
else:
    average = letters / (words + 1)
    return letters, words + 1, average

默认情况下,您将单词加 1... 这并非在所有情况下都有效:"Hi!" 就是一个很好的例子。这实际上是推迟所有字符串的原因:只要字符串不以单词结尾,您的函数就会关闭。

提示:如果最后一个单词后面没有标点,你只想加一个。

【讨论】:

  • 哈!我让它工作了!我没有意识到我将我的万能字数统计方法(字数 + 1)视为理所当然。感谢您帮助我以另一种方式思考它。无。我是新手,这是有史以来最基本的功能,但我现在很高兴! #令人满意
【解决方案2】:

当字符串以标点字符开头时会出现问题:前一个字符仍然是"" 并且不被视为标点字符,因此不存在的单词被计算在内。

你可以在符号列表中添加"",或者这样做:

punctuation = " !?.,"

因为如果 c 是 s 的子串,也就是如果 c 是 s 的字符,测试 c in s 返回 true。并且每个字符串都包含空字符串。


第二个问题出现在结尾,如果字符串以单词结尾,则不计入(您的word+1 是否可以解决该问题?),但如果字符串以单词结尾标点符号,最后一个单词被计算在内。

for 循环之后添加这个:

if char not in punctuation:
   words += 1

现在不用加1了,直接用

average = letters / words

【讨论】:

  • 我希望 "" not in punctuation 成为 False(见第 13 行),一切正常
  • 我收回我说的话。我不假思索地将标点符号转换为" !?.,"。你提出了一个有效的观点:)
  • Aaaaaa,我什至从未认为问题出在字符串的开头。我在上面发布了我的解决方案,但是根据您和@TemporalWolf 的建议,我按它们的开始而不是结束来计算单词。
【解决方案3】:

这变得更加困难,因为我假设您不允许使用像 split() 这样的内置字符串函数。

我的处理方法是:

  1. 将句子拆分为单词列表。
  2. 计算每个单词中的字母。
  3. 取字母的平均数量。

    def averageWordLength(myString):

    punctuation = [" ", "!", "?", ".", ","]
    
    if not isinstance(myString, str):
        return "Not a string"
    
    split_values = []
    word = ''
    for char in myString:
        if char in punctuation:
            if word:
                split_values.append(word)
            word = ''
        else:
            word += char
    if word:
        split_values.append(word)
    
    letter_count = []
    for word in split_values:
        letter_count.append(len(word))
    
    if len(letter_count):
        return sum(letter_count)/len(letter_count)
    else:
        return "No words."
    

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2021-09-06
    • 1970-01-01
    • 2018-09-10
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多