12
votes

This is a short one, yet very irritating. I know I can count the amount of times a string occurs within another string like this:

'banana'.count('a')
>>>3

meaning that banana contains the letter "a" 3 times.

This is where it gets kind of weird.

My first confusion is - when I do 'foo'.count(''), what does Python look for?

is '' == None == anything?

It doesn't seem to be the case, but then again, what IS '' logically speaking? And more importantly, why does

'test'.count('')
>>>5

return one more than the length of the string?

What the hell is included in a string that's always 1 higher than the amount of letters? the void?

EDIT: the ' character twice looks like one " character. I am talking about two times ' here, to avoid confusion

EDIT2: There seems to be some confusion about how the amount of '' happen. Refer to comments below.

2
since ''.count('') returns one im assuming that it literally searches for nothing. - Flying Thunder
It always returns len(string)+1, this is just a decision the developers took, you could make a case for other values (like infinity), there is a dupe somewhere - Chris_Rands
You could see s.count('') as counting the number of inter-letter spaces in the string, i.e. the ones used when parsing regexes. - Marco Capitani
See here for another explanation - cs95
@FlyingThunder please accept the other answer so I can freakin delete this -_- - NoorJafri

2 Answers

27
votes

Every string1 can be thought of as:

any_string = "" + "".join(any_string) + ""

which contains exactly len(any_string) + 1 instances of ''.


For "foo" for example, it would be:

"" + "f" + "" + "o" + "" + "o"+ ""
#    |----- from join -------|

As it can be seen there are 4 instances of "" in it.


Note however, that this is a problem where no answer or all answers could somehow support a case for themselves. It get's philosophical:

  • How much nothing is contained in nothing?
  • How much nothing is contained in something?

This answer tries to explain the convention used by Python and does not intend to suggest that this is the way all languages do it \ should be doing it; it is just how Python does it.


1Empty strings are an exception and are handled differently; they simply return 1; which is yet another convention.

7
votes
str.count(sub)

Counts the number of occurrences of sub in str.

Since strings are sequences, it basically counts the number of splits sub would cause in str.

An empty string is at the beginning, between each character, and at the end.

Hence, why when you use 'test', which has a len of 4, you get 5 occurrences of sub ('').