Counting Letter Frequency in a String (Python)

后端 未结 12 2084
既然无缘
既然无缘 2020-12-01 17:52

I am trying to count the occurrences of each letter of a word

word = input(\"Enter a word\")

Alphabet=[\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\'         


        
相关标签:
12条回答
  • 2020-12-01 18:25

    Initialize an empty dictionary and iterate over every character of the word. If the current character in present in the dictionary, increment its value by 1, and if not, set its value to 1.

    word="Hello"
    characters={}
    for character in word:
        if character in characters:
            characters[character] += 1
        else:
            characters[character] =  1
    print(characters)
    
    0 讨论(0)
  • 2020-12-01 18:27
    from collections import Counter
    counts=Counter(word) # Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1})
    for i in word:
        print(i,counts[i])
    

    Try using Counter, which will create a dictionary that contains the frequencies of all items in a collection.

    Otherwise, you could do a condition on your current code to print only if word.count(Alphabet[i]) is greater than 0, though that would slower.

    0 讨论(0)
  • 2020-12-01 18:27

    As @Pythonista said, this is a job for collections.Counter:

    from collections import Counter
    print(Counter('cats on wheels'))
    

    This prints:

    {'s': 2, ' ': 2, 'e': 2, 't': 1, 'n': 1, 'l': 1, 'a': 1, 'c': 1, 'w': 1, 'h': 1, 'o': 1}
    
    0 讨论(0)
  • 2020-12-01 18:27

    Following up what LMc said, your code was already pretty close to functional, you just needed to post-process the result set to remove 'uninteresting' output. Here's one way to make your code work:

    #!/usr/bin/env python
    word = raw_input("Enter a word: ")
    
    Alphabet = [
        'a','b','c','d','e','f','g','h','i','j','k','l','m',
        'n','o','p','q','r','s','t','u','v','w','x','y','z'
    ]
    
    hits = [
        (Alphabet[i], word.count(Alphabet[i]))
        for i in range(len(Alphabet))
        if word.count(Alphabet[i])
    ]
    
    for letter, frequency in hits:
        print letter.upper(), frequency
    

    But the solution using collections.Counter is much more elegant/Pythonic.

    0 讨论(0)
  • 2020-12-01 18:28

    For future references: When you have a list with all the words you want, lets say wordlistit's pretty simple

    for numbers in range(len(wordlist)):
        if wordlist[numbers][0] == 'a':
            print(wordlist[numbers])
    
    0 讨论(0)
  • 2020-12-01 18:28

    It might make sense to include all letters of the alphabet. For example, if you're interested in calculating the cosine difference between word distributions you typically require all letters.

    You can use this method:

    from collections import Counter 
    
    def character_distribution_of_string(pass_string):
      letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
      chars_in_string = Counter(pass_string)
      res = {}
      for letter in letters:
        if(letter in chars_in_string):
          res[letter] = chars_in_string[letter]
        else: 
          res[letter] = 0 
      return(res)
    

    Usage:

    character_distribution_of_string("This is a string that I want to know about")
    

    Full Character Distribution

    {'a': 4,
     'b': 1,
     'c': 0,
     'd': 0,
     'e': 0,
     'f': 0,
     'g': 1,
     'h': 2,
     'i': 3,
     'j': 0,
     'k': 1,
     'l': 0,
     'm': 0,
     'n': 3,
     'o': 3,
     'p': 0,
     'q': 0,
     'r': 1,
     's': 3,
     't': 6,
     'u': 1,
     'v': 0,
     'w': 2,
     'x': 0,
     'y': 0,
     'z': 0}
    

    You can extract the character vector easily:

    list(character_distribution_of_string("This is a string that I want to know about").values())
    

    giving...

    [4, 1, 0, 0, 0, 0, 1, 2, 3, 0, 1, 0, 0, 3, 3, 0, 0, 1, 3, 6, 1, 0, 2, 0, 0, 0]
    
    0 讨论(0)
提交回复
热议问题