返回字母表中每个字母出现的次数

时间:2016-11-21 04:28:07

标签: python string python-3.x iteration

我写了一个函数来计算给定字符串中单个字母的出现次数:

def count_letters(string, letter):
'''returns the number of letters letter in a sentence string.'''

count = 0
for char in string:
    if char == letter:
        count += 1
return count

现在,我想找到一种方法以列表格式返回所有字母出现的次数(假设它们都是小写的 - 我正在使用string.lower())。我将字母计数器初始化为26 0的列表:

letter_counter = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

但我不知道如何遍历给定的字符串并为每个字母附加列表。

实施例。如果string = "Hello"letter_counter返回:

letter_counter = [0,0,0,0,1,0,0,1,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0]

我认为这只是for循环中for循环的问题,但似乎更复杂。或者我可能已经看了太久了。

提前致谢。

5 个答案:

答案 0 :(得分:1)

为什么重新发明轮子?

你可以使用$ train = pd.DataFrame([[0,1,2,3]],columns=['A','D','E','G']) $ train A D E G 0 0 1 2 3 $ test = pd.DataFrame([[0,1,2,3,4,5,6]],columns=['A','B','C','D','E','F','G']) $ test A B C D E F G 0 0 1 2 3 4 5 6 $ test_df = test[train.columns] $ test_df A D E G 0 0 3 4 6 来返回字典,字符串中的所有字母都作为键,频率作为所述键的值。

答案 1 :(得分:1)

更好的方法是使用Alessandro Power和Pythonista建议的集合。如果您不想使用那个黑盒子,那么这就是您可以做的。

    # Replace this with your string
    string = 'AbcdEfghiJ'
    # create dictionary to locate a position of each letter
    str_dict = {'a':0, 'b':1, 'c':2, 'd':3, 'e':4, 'f':5, 'g':6, 'h':7,
        'i':8, 'j':9, 'k':10, 'l':11, 'm':12, 'n':13, 'o':14,
        'p':15, 'q':16, 'r':17, 's':18, 't':19, 'u':20, 'v':21,
        'w':22, 'x':23, 'y':24, 'z':25}
    letter_counter = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    # locate a position of char in letter_counter and add 1.
    for char in string:
        str_lower = char.lower()
        letter_counter[str_dict[str_lower]] += 1

    print letter_counter

输出[1]:[1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0]

答案 2 :(得分:1)

要计算字母数,您可以按优先顺序选择多种选项:

  1. collections.Counter如果你想快速完成这项工作。
  2. 使用字典(这是Counter所做的)
  3. 使用(零)填充列表 - 您的方法。
  4. collection.Counter方法非常简单:

    >>> from collections import Counter
    >>> Counter('hello').most_common()
    [('l', 2), ('h', 1), ('e', 1), ('o', 1)]
    

    字典方法,需要更多的工作。有两种方法可以做到。第一种方法是使用setdefault字典方法确保第一次看到字母时,使用默认值正确初始化。

    >>> d = {}
    >>> for letter in 'hello':
    ...    d[letter] = d.setdefault(letter, 0) + 1
    ...
    >>> d
    {'h': 1, 'e': 1, 'l': 2, 'o': 1}
    

    第二种方法使用与上述相同的概念,但使用defaultdict代替:

    >>> from collections import defaultdict
    >>> d = defaultdict(int)
    >>> for letter in 'hello':
    ...    d[letter] += 1
    ...
    >>> d
    defaultdict(<type 'int'>, {'h': 1, 'e': 1, 'l': 2, 'o': 1})
    

    defaultdict是一个采用可调用(一个函数)的对象,如果字典中没有键,则该值将被指定为默认值。与setdefault相同,但它可以做的更灵活。

    最后一个选项是零填充列表:

    >>> counts = [0 for i in range(25)]
    >>> for letter in 'hello':
    ...     counts[ord(letter.lower()) % 97] += 1
    ...
    >>> counts
    [0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    >>> counts[11]
    2
    

    这种方法存在一些问题;最大的一个是它只适用于某些单词,它不适用于hello world之类的短语或连接词或标点符号:We've won!

    您可以随时编程,但其他方法没有这些问题。

答案 3 :(得分:0)

您可以使用ord()将小写字母转换为其unicode索引,然后减去97(&#39; a&#39; = 97,&#39; b&#39; = 98等):

def count_letters(word):
    l_count = [0] * 26
    for c in word.lower():
        l_count[ord(c)-97] += 1
    return l_count

> count_letters('aaabbc')
[3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

你绝对应该避免在字符串中循环26次以单独计算每个字母!

答案 4 :(得分:0)

  • 这是一种简单的方法来计算字符中每个字符的频率 使用 java 编程
  • 的字符串
  • 注意:它按字母顺序而不是按字母顺序输出 发生。
  • 例如:输入:“ Hello”输出:e = 1 h = 1 l = 2 o = 1

    class char_frequency
        { public static void main (String s)
    { s=s.toLowerCase();
        for (char i= 'a'; i<='z'; i++)
        {check (s,i);}
    }
    
    public static void check (String s, char ch)
    { int l= s.length(); char a='a'; int c=0;
        for (int i= 0; i<=l-1; i++)
        { a= s.charAt (i);
            if (ch== a)
                c++;
    
        }
             if (c>0)
             System.out.println ( ch+ "= " + c);
    }
    

    }