2012-07-24 74 views
0

我試圖瞭解string.count的運作基本上 它的記錄定義是需要了解string.count的功能()函數

string.count(S,子[日開始[,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在這裏。總的來說,我需要了解這個功能是如何工作的。

+1

請注意,您不需要字符串模塊,例如使用''ab'.count('a')'。更好 – jamylak 2012-07-24 11:43:34

回答

5

每當你看到一個3作爲結果,第二個參數是空字符串 - 你通過使用奇怪的切片隱藏這個面。對於本示例,空串被認爲發生在位置0:0,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 
+0

OP也似乎認爲'開始'和'結束'參數切片'sub',而不是's'(假設粘貼的實驗試圖理解粗線) – DSM 2012-07-24 11:55:52

+1

(這不但是要尊重非重疊部分:'count(「aaa」,「aa」)'產生'2'而不是'1'。) – phant0m 2012-07-24 12:52:42

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每個字符之間)

2

我認爲你的錯誤在於誤解了文檔使用的標記。

string.count(S,子[,開始[,結束]])返回的子子的 (非重疊)的出現數在字符串s [開始:結束。 開始和結束的默認值以及負值的解釋是 與切片相同。

方括號[]表示可選參數。它提供三種不同的方法簽名的簡寫形式,它們並不是實際語法的一部分來調用方法:

  • 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)
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。 http://svn.python.org/view/結賬 /python/trunk/Objects/stringlib/count.h?content-type=text%2Fplain:

你可以在Python源代碼在這裏看到這一點。

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'出現。

更清晰?