【问题标题】:Need to understand the functionality of string.count() function需要了解 string.count() 函数的功能
【发布时间】:2012-07-24 23:34:25
【问题描述】:

我试图了解 string.count 的基本功能 它的文档化定义是

string.count(s, sub[, start[, end]])
返回字符串 s[start:end] 中子字符串 sub 的(非重叠)出现次数。开始和结束的默认值和 负值的解释与切片相同。

现在最后一行的确切含义是什么,实际上是粗体。我用这个函数做了一些随机实验

In [19]: a
Out[19]: 'ab'
In [23]: string.count(a,'ab'[1:3])
Out[23]: 1

In [24]: string.count(a,'ab'[1:1])
Out[24]: 3

In [25]: string.count(a,'ab'[-1:1])
Out[25]: 3

In [26]: string.count(a,'ab'[-1:0])
Out[26]: 3

In [27]: string.count(a,'ab'[1:4])
Out[27]: 1

In [28]: string.count(a,'ab'[1:100])
Out[28]: 1

In [29]: string.count(a,'ab'[100:100])
Out[29]: 3

In [30]: string.count(a,'ab'[:])
Out[30]: 1

In [31]: string.count(a,'a'[:])
Out[31]: 1

谁能解释一下为什么有时我得到的结果是 1,为什么有时是 3。总的来说,我需要了解这个函数是如何工作的?

【问题讨论】:

  • 请注意,您不需要字符串模块,例如使用'ab'.count('a')。更好

标签: python string conceptual concept


【解决方案1】:

每次你看到3 作为结果时,第二个参数是空字符串——你通过使用奇怪的切片来隐藏这个事实。对于这个例子,空字符串被认为出现在0:01:12:2的位置,所以出现了三个。通常,string.count(s, "")(或等效的s.count(""))将返回len(s) + 1

为了解释这个结果是如何产生的,这里是string.count() 的一个(不是很有效的)示例实现:

def count(s, sub):
    result = 0
    for i in range(len(s) + 1 - len(sub)):
        result += (s[i:i + len(sub)] == sub)
    return result

【讨论】:

  • OP 似乎也认为startend 参数切片sub,而不是s(假设粘贴的实验试图理解粗体线。)
  • (虽然这不尊重非重叠部分:count("aaa", "aa") 产生 2 而不是 1。)
【解决方案2】:

我认为您的错误在于误解了文档使用的符号。

string.count(s, sub[, start[, end]]) 返回的个数 (非重叠)子字符串 sub 在字符串 s[start:end] 中的出现。 开始和结束的默认值以及负值的解释是 与切片相同。

方括号[] 表示可选参数。它是提供三种不同方法签名的简短形式,它们不是调用方法的实际语法的一部分:

  • string.count(s, sub)
  • string.count(s, sub, start)
  • string.count(s, sub, start, end)

开始和结束的默认值以及负值的解释是 与切片相同。

这是切片:

>>> "0123_3210"[:3] # from the first until the 3rd item, excluding it
'012'
>>> "0123_3210"[-3:] # from the 3rd-to-last until the end
'210'
>>> "0123_3210"[-3:-1] # from the 3rd-to-last until the end, excluding one item
'21'
>>> "0123_3210"[1:3] # from the second item until the 3rd, excluding it
'12

如您所见,当您使用负索引时,它从右端开始计数。

意思是,它们分别对startend 的正负等价。

  • string.count(s[:], sub)string.count(s, sub)
  • string.count(s[start:], sub)string.count(s, sub, start)
  • string.count(s[start:end], sub)string.count(s, sub, start,end)

【讨论】:

    【解决方案3】:

    您的困惑似乎来自不确定如何使用切片表示法,或者不清楚 string.count() 相对于空字符串的行为。 p>

    我认为阅读 http://docs.python.org/tutorial/introduction.html#strings 会为您服务。

    In [19]: a 
    Out[19]: 'ab' 
    

    好的。

    In [23]: string.count(a,'ab'[1:3]) 
    Out[23]: 1
    

    'ab'[1:3] == 'b'。 'ab' 中有一个 'b' 的实例。

    In [24]: string.count(a,'ab'[1:1]) 
    Out[24]: 3
    

    'ab'[1:1] == ''。

    python 中任何字符串中 '' 的计数等于 len(string)+1 除非字符串长度大于 INT_MAX(我相信),在这种情况下它返回 INT_MAX。

    您可以在此处的 Python 源代码中看到这一点:http://svn.python.org/view/checkout/python/trunk/Objects/stringlib/count.h?content-type=text%2Fplain。

    In [25]: string.count(a,'ab'[-1:1]) 
    Out[25]: 3
    

    'ab'[1:1] == ''。再次,您正在计算 ''。

    In [26]: string.count(a,'ab'[-1:0]) 
    Out[26]: 3  
    

    'ab'[1:1] == '',再次。

    In [27]: string.count(a,'ab'[1:4]) 
    Out[27]: 1  
    

    'ab'[1:4] == 'b'。

    In [28]: string.count(a,'ab'[1:100]) 
    Out[28]: 1  
    

    'ab'[1:100] == 'b'。

    In [29]: string.count(a,'ab'[100:100]) 
    Out[29]: 3  
    

    'ab'[100:100] == ''。

    In [30]: string.count(a,'ab'[:]) 
    Out[30]: 1  
    

    'ab'[:] == 'ab'。 'ab' 中出现了一次 'ab'。

    In [31]: string.count(a,'a'[:]) 
    Out[31]: 1 
    

    在这种情况下,'a'[:] == 'a'。 'ab' 中出现了一个 'a'。

    更清楚吗?

    【讨论】:

      【解决方案4】:

      [...] 负值的解释与切片相同

      用于string.count(...) 函数的第三个和第四个可选参数。

      In [1]: import string
      
      In [2]: s = 'hello world'
      
      In [3]: string.count(s, 'o')
      Out[3]: 2
      
      In [4]: string.count(s, 'o', 5, 9) # count from 6th to 10th characters
      Out[4]: 1
      
      In [5]: string.count(s, 'o', 5, 9) == string.count(s[5:9], 'o')
      Out[5]: True
      
      In [6]: string.count(s, 'o', -9, -5) # count from 3rd to 6th characters
      Out[6]: 1
      

      这与搜索空字符串有很大不同:

      In [7]: string.count(s, 'o'[5:9]) == string.count(s, '') == (2 + (len(s) - 1))
      Out[7]: True
      

      (s的每个字符的开头、结尾和每个字符之间都有“空字符串”)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多