需要了解string.count()函数的功能

时间:2012-07-24 11:41:28

标签: python string conceptual concept

我试图理解string.count的功能 记录在案的定义是

  

string.count(s,sub [,start [,end]])
  返回字符串s [start:end]中substring 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这里。总的来说,我需要了解这个功能是如何工作的?

4 个答案:

答案 0 :(得分:5)

每当您看到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

答案 1 :(得分:2)

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

  

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

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

  • 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)

答案 2 :(得分:1)

  

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

用于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的每个字符之间都有“空字符串”)

答案 3 :(得分:1)

似乎你的困惑来自于不确定如何使用切片符号,或者没有清楚 string.count()相对于空字符串的行为。

我认为阅读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(字符串)+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'出现。

更清晰?