【问题标题】:String instead of integer in finding "bob"寻找“鲍勃”时使用字符串而不是整数
【发布时间】:2016-09-12 21:21:24
【问题描述】:

我的问题代码:

count = 0

for char in s:

    if char.startswith("bob"):

        count += 1

print ("Number of times bob occurs is: " + str(count))

我有一个很好的解决方案如下:

count = 0

for i in range(len(s)):

     if s[i: i+3] == "bob"

        count += 1

print ("Number of times bob occurs is: " + str(count))

我的问题:我想要一个使用字符/字符串的替代解决方案,而不是使用整数“for i in range(len(s))”的解决方案。谁能告诉我为什么我的上述解决方案在找到“bob”时返回“0”?谢谢。

【问题讨论】:

  • 没有字符以"bob" 开头。 "bob" 的长度为 3 个字符。
  • @TemporalWolf 他已经知道正确的方法了。他的问题是为什么他的第一次尝试没有奏效,而那里没有回答。
  • @Barmar 在问题中解决了做他想做的事情的正确方法。提出的问题是一种误解,正如所写的那样,它不太可能使未来的用户受益。 -> user2357112 的评论可能就足够了,我主张应该关闭它。

标签: python


【解决方案1】:

您的第一段代码的问题将通过循环中的打印语句变得明显。语句for char in s 循环遍历s 中的每个字符,并且没有字符以单词bob 开头。

如果你真的想要一个for something in something 类型的循环,你可以这样做:

count = 0
for word in s.split():
    if word == "bob":
        count += 1
print ("Number of times bob occurs is: " + str(count))

这仅在您希望仅匹配仅作为单词出现的 bob 时才有效。如果要在任何地方匹配 bob,请使用 string.count 方法:

count = s.count("bob")

或者,正则表达式:

import re
count = len(re.findall("bob", s))

如果您想要重叠的答案。这实际上是您在 for 循环中所做的,但更简洁。我认为没有比这更简单的方法来计算重叠出现的次数了。

[s[i:i+3] for i in range(len(s))].count('bob')

【讨论】:

  • 这将在bobbobHi bob!". string.split` 通过空格分隔标记时失败。
  • @TemporalWolf 答案解决了这个问题。
  • 嗨,高拉斯,非常感谢!我喜欢你的第二个想法:“count = s.count("bob")”,非常简单。我想知道如果我使用这个解决方案,整个代码是否会是:print s.count("bob")?我试过一种情况:s = "bobbobfdsfadfobobobfd"。应该有 4 个“鲍勃”,而它只为我返回 3 个。你或任何人能给我一个提示吗?
  • @fandango 根据文档,str.count“返回字符串 s 中子字符串 sub 的(非重叠)出现次数。”如果您想要重叠的结果,请检查我刚刚添加到答案中的第四件事。
【解决方案2】:

您的第一个代码不起作用,因为

for char in s:

只需将char 设置为字符串中的单个字符。所以如果s = "bob is bob"char 将是"b""o""b""i" 等。这些单字符串都不是以"bob" 开头的,所以if 测试永远不会成功。

没有用于循环子字符串的内置循环语法,因此您需要迭代索引。

【讨论】:

  • 非常感谢您,巴尔玛!所以,“char”代表一个字符,即使我将“char”更改为“word”,它仍然代表一个字符,对吗?如果我想在一个完整的字符串(在本例中为“s”)中表达“对于某个字符串(不是单个字符)”怎么办?谢谢。
  • char 只是一个变量名,没有任何意义。关键是当您将for-in 与字符串一起使用时,您迭代的内容是字符串中的字符。
  • 没有内置的方式来表达对子字符串的迭代,您必须使用切片显式构造它们。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多