Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Same Python code returns different results for same input string

Below code is supposed to return the most common letter in the TEXT string in the format:

  • always lowercase
  • ignoring punctuation and spaces
  • in the case of words such as "One" - where there is no 2 letters the same - return the first letter in the alphabet

Each time I run the code using the same string, e.g. "One" the result cycles through the letters...weirdly though, only from the third try (in this "One" example).

text=input('Insert String: ')
def mwl(text):
    from string import punctuation
    from collections import Counter
    for l in punctuation:
        if l in text:
            text = text.replace(l,'')
    text = text.lower()
    text=''.join(text.split())
    text= sorted(text)
    collist=Counter(text).most_common(1)
    print(collist[0][0])
mwl(text)   
like image 772
Dom13 Avatar asked Sep 13 '26 04:09

Dom13


2 Answers

Counter uses a dictionary:

>>> Counter('one')
Counter({'e': 1, 'o': 1, 'n': 1})

Dictionaries are not ordered, hence the behavior.

like image 152
fredtantini Avatar answered Sep 14 '26 18:09

fredtantini


You can get the desired output with OrderedDict replacing the below two lines:

text= sorted(text)
collist=Counter(text).most_common(1)

with:

collist = OrderedDict([(i,text.count(i)) for i in text])
collist = sorted(collist.items(), key=lambda x:x[1], reverse=True)

You also need to import OrderedDict for this.

Demo:

>>> from collections import Counter, OrderedDict
>>> text = 'One'
>>> collist = OrderedDict([(i,text.count(i)) for i in text])
>>> print(sorted(collist.items(), key=lambda x:x[1], reverse=True)[0][0])
O  
>>> print(sorted(collist.items(), key=lambda x:x[1], reverse=True)[0][0])
O    # it will always return O
>>> text = 'hello'
>>> collist = OrderedDict([(i,text.count(i)) for i in text])
>>> print(sorted(collist.items(), key=lambda x:x[1], reverse=True)[0][0])
l    # l returned because it is most frequent
like image 20
Irshad Bhat Avatar answered Sep 14 '26 17:09

Irshad Bhat



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!