0

我试图基本上了解 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。总的来说,我需要了解这个功能是如何工作的?

4

4 回答 4

5

每次看到3结果时,第二个参数都是空字符串——你通过使用奇怪的切片来隐藏这个事实。空字符串被认为出现在位置0:0,对于这个例子,出现了 3 次1: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
于 2012-07-24T11:45:34.193 回答
2

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

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

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

  • 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

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

start所说的是,这些对于和的正负都是等价的end

  • 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)
于 2012-07-24T12:55:35.570 回答
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

于 2012-07-24T12:26:56.797 回答
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(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”。

更清晰?

于 2012-07-24T13:42:35.827 回答