我试图理解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这里。总的来说,我需要了解这个功能是如何工作的?
答案 0 :(得分:5)
每当您看到3
作为结果时,第二个参数是空字符串 - 您通过使用奇怪的切片隐藏此工具。对于此示例,空字符串被认为发生在0:0
,1:1
和2: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
如您所见,当您使用否定索引时,它会从右端开始计数。
说的是,这些对于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)
答案 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'出现。
更清晰?