Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does "test".count('') return 5? [duplicate]

Tags:

python

count

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.

like image 501
Flying Thunder Avatar asked May 08 '18 14:05

Flying Thunder


2 Answers

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.

like image 163
Ma0 Avatar answered Nov 07 '22 06:11

Ma0


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 ('').

like image 40
Matt_G Avatar answered Nov 07 '22 08:11

Matt_G