【问题标题】:Why does '12345'.count('') return 6 and not 5?为什么 '12345'.count('') 返回 6 而不是 5?
【发布时间】:2015-09-06 00:50:46
【问题描述】:
>>> '12345'.count('')
6

为什么会这样?如果该字符串中只有 5 个字符,为什么 count 函数又返回一个?

另外,有没有更有效的方法来计算字符串中的字符数?

【问题讨论】:

  • 想想栅栏柱和栅栏板。每个面板上都有一个字符。每个帖子都没有字符。
  • 简单的无法读取the documentation。不知道为什么有这么多的赞成票。 -1
  • @LightnessRacesinOrbit:文档与实现不同步。根据文档Return the number of non-overlapping occurrences of substring sub in the range [start, end].,结果应该是 4。
  • @Abhijit 您在哪里看到实现和文档之间的区别?在我看来,这句话清楚地说明了为什么结果是 6。由于“开始”和“结束”是 inclusive,因此它们前面(和后面)的空字符串也很重要。
  • @Abhijit: start 和 end 采用默认值(实际上是 None,但在逻辑上等价于 0 和 len('12345'))。因此,在[start, end] 范围内,空子字符串有 6 次“出现”,特别是 [0:0]、[1:1]、...[5:5]。如果指定的范围是[start, end),不包括一个端点,那么我们就不会有[5:5],如果范围是(start, end),不包括两个端点,那么我们也不会有[0:0],在这种情况下4会是对的。但是如果定义排除了端点,那么'abc'.count('abc') 将是 0,这将是相当令人惊讶的 ;-)

标签: python python-3.x count


【解决方案1】:

最常见的方式是使用len('12345')。它返回给定字符串中的字符数 - 在本例中为 5。

【讨论】:

    【解决方案2】:

    这也是为什么 ''.count('') 返回 1 而不是 0 有意义的原因。

    【讨论】:

    • 为什么是1 而不是0,为什么不是100。我很确定0*100 == 0
    【解决方案3】:

    Count 和 Len 是两个截然不同的东西。 Len 仅打印字符串的长度(因此命名为“Len”),而 Count 遍历字符串或列表并为您提供对象出现的次数,它计算字符串的开头和结尾以及介于两者之间的次数每个字母。

    【讨论】:

      【解决方案4】:

      count 返回一个对象在列表中出现的次数,因此如果计算'' 的出现次数,您会得到 6,因为空字符串位于每个字母的开头、结尾和中间。

      使用len 函数查找字符串的长度。

      【讨论】:

      • 我认为使用可迭代对象而不是list!
      • “一个对象在一个列表中出现了多少次”是一个模糊的概念:如果我将空列表连接 100 次,我会得到 count(s,'') 为 100 吗?此外,“发生”可能会让人认为 s[i] 对于某些 i 是 object - 混淆成员资格和子列表。说count(s,z) 返回索引的数量0<=i<=len(s) 使得s[i:] 以z 开头,也许会更明确。
      • 操作询问字符串而不是列表。所以从文档str.count“返回子字符串子的非重叠出现次数”
      • 为什么字母之间有一个'',而不是五个或根本没有?
      • 我不认为它回答了这个问题:list('a').count('') == 0,而是'a'.count('') == 2。它看起来像是当前实现的工件,因为 'a'.split('') 失败并显示 ValueError
      【解决方案5】:

      那是因为有六个不同的子字符串是空字符串:在 1 之前,在数字之间,在 5 之后。

      如果您想计算字符数,请改用len:

      >>> len("12345")
      5
      

      【讨论】:

      • 它什么也没解释。答案可能是零,因为有零个项目,例如 s[i] == ''。
      • @J.F.Sebastian 诸如 s[i] 是空字符串和空子字符串的项目完全是不同的概念。可以选择一个子字符串,使其具有零个字符,这可以通过六种不同的方式完成(从索引 0 长度为 0,从索引 1 长度为 0,等等)
      • 是的。我的错误(s[i] 暗示 len(sub) == 1,因此不能用于空字符串)。但它仍然没有解释结果。很明显,该实现计算了s 中等于sub 的非重叠切片s[i:i+len(sub)]。它没有解释为什么包含s[end:end+len(sub)]:通常s[start:end] 切片不包含end 位置。
      • @JFSebastian 如果len(sub) 等于0,那么切片是s[i:i],它是空的(因为没有元素使得它们的索引>= i 但也有
      • 它如何解释i == end 是允许的?我知道s[end:end] 本身是有效的,但str.count() 文档明确表示start,end 应解释为切片表示法,即i<end,因此s[end:end] 不应包含在计数中。
      【解决方案6】:

      如果你把一根绳子剪五次,你会得到多少块?

      ---|---|---|---|---|---     -> 6 pieces
      

      这里也发生了同样的事情。它还计算5 之后的空字符串。

      len('12345') 是你应该使用的。

      【讨论】:

      • 如果'a'.split('') 正常工作,这将是答案。
      猜你喜欢
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多