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

結果としてa が表示3されるたびに、2 番目のパラメーターは空の文字列でした。奇妙なスライスを使用して、この事実を隠しています。空の文字列は の位置0:0で発生する1:1と見なされ2:2、この例では 3 回発生します。一般に、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 の (重複しない) 出現回数を返します。開始と終了のデフォルトと負の値の解釈は、スライスの場合と同じです。

角括弧[]はオプションの引数を表します。これは、3 つの異なるメソッド シグネチャを提供するための短い形式であり、メソッドを呼び出す実際の構文の一部ではありません。

  • 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

[...]負の値の解釈はスライスの場合と同じです

関数の3番目と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

于 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」のインスタンスが 1 つあります。

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

'ab'[1:1] == ''.

Python の任意の文字列の '' の数は、文字列の長さが INT_MAX を超えない限り、len(string)+1 に等しくなります (私は信じています)。その場合、INT_MAX を返します。

これは、 http : //svn.python.org/view/checkout/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」が 1 つあります。

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

この場合、'a'[:] == 'a' です。「ab」には「a」が 1 つあります。

より明確ですか?

于 2012-07-24T13:42:35.827 に答える