【问题标题】:Counting number of times words appear In strings计算单词出现在字符串中的次数
【发布时间】:2020-04-12 05:28:50
【问题描述】:

我正在练习编码 bat,问题是找出单词“code”在字符串中出现的次数,但“code”中的字母“d”可以替换任何字母。所以“代码”的计数为 1,“应对”也为 1。我写了一些代码,但它不起作用。我不明白为什么它不起作用。该函数为每个输入返回 0。这是我尝试过的链接https://codingbat.com/prob/p186048

def count_code(str):
     count = 0
     str = str.lower()
     for x in str:
         if x == ‘c’ and str.find(x) + 1 == “o” and str.find(x) + 3 == “e”:
            count += 1
     return count 

【问题讨论】:

  • 请将此减少并增强为预期的MRE。您发布的代码仅定义了一个函数并退出而不执行任何操作。 “它不起作用”不是问题规范——编写您的测试用例并向我们展示问题。

标签: python


【解决方案1】:

正如 Tim 所说,我会在此类任务中使用正则表达式,但是,如果您需要一种更简单的方法(不是最有效的方法,而是一种方法):

import string


text = 'elephant code joke cole coke man'
total = 0
for letter in string.ascii_lowercase:
    total += text.count(f'co{letter}e')
print(f'{total}')

请注意,在您的解决方案尝试中,有这样的:

for x in str:

除了您应该避免名称冲突str 在这种情况下,对于大小为 1000 个字符的文本,您将使用这种方法进行 1000 次迭代,减少到 26 次迭代(字母表字母)。

【讨论】:

【解决方案2】:

我会在这里使用re.findall,然后只计算找到了多少匹配项:

inp = "blah code blah cole blah core blah"
print(len(re.findall(r'\bco[a-z]e\b', inp)))    # prints 3

这里使用的正则表达式模式是\bco[a-z]e\b,它匹配任何单词code,其中第三个字母d实际上可以是任何字母。

【讨论】:

  • 对于任何字符,而不仅仅是字母:print(len(re.findall(r'\bco.?e\b', inp)))
  • @DavidErickson 不,正则表达式模式不正确。第三个字母点后面不应该有?,否则也会匹配coe之类的东西
  • 能否请您提供一个对初学者更友好的解决方案。这些我都不懂。
  • 您需要导入任何东西才能使用 re.findall 吗?编码蝙蝠说're'是未定义的
  • 是的,使用:import re
【解决方案3】:

你混淆了索引和字符的内容:

str.find(x) + 1 == ‘o’

永远不会为真:您的find 调用将返回字符串中第一个此类字符的位置。您将 1 添加到该索引。你如何想象这个整数和可以等于字符'o'?整数和字符不能相等。

您需要备份并重新设计您的逻辑。当你这样做时,请参阅debugging help 这个可爱的参考。您需要学习如何在自己的代码中跟踪问题。

【讨论】:

  • 哦。等等,如果我将它设置为等于“o”和“e”的索引,它会起作用吗?
  • 在写到这里之前你应该知道它是否有效——你尝试它。不要问我们——问你面前的Python解释器。
  • 好的,我将它设置为“o”和“e”的索引,编码蝙蝠说它适用于一半以上的测试。但是,如果有像“xxcozeyycop”这样的输入,程序会返回 2 而预期的答案是 1。
  • ...这是由于滥用find。你的调试告诉你关于内部操作的什么?这不是适合 Stack Overflow 的讨论。
【解决方案4】:

为此使用正则表达式,它是快速、方便且简短的代码。

#CODE
import re

#findall() Returns a list containing all matches
str="cole code cope"
result = re.findall("co.e", str) 
print(len(result))
#END

希望这能满足您的要求。

【讨论】:

  • 这(几乎)是我的答案的逐字副本,我在 2 小时前发布了该答案。这不是网站的运作方式。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 2021-01-09
  • 2014-04-29
  • 2015-09-14
  • 1970-01-01
  • 2013-02-01
  • 2019-07-31
  • 2022-01-06
相关资源
最近更新 更多