Python 返回字母表中每个字母在字符串中出现的次数
我编写了一个函数来计算给定字符串中单个字母的出现次数:Python 返回字母表中每个字母在字符串中出现的次数,python,string,python-3.x,iteration,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 现在,我想找到一种方法,以列表格式返回所有字母出现的次数(假设它们都是
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 = [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循环的问题,但它似乎更复杂。也许我只是看了太久
提前感谢。为什么要重新发明轮子
你可以使用collections.Counter(string)
,它将返回一个字典,其中字符串中的所有字母作为键,频率作为键的值。为什么要重新发明轮子
您只需使用集合。计数器(字符串),它将返回一个字典,其中字符串中的所有字母作为键,频率作为所述键的值。更好的方法是按照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
Out[1]:[1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]更好的方法是按照亚历山德罗·鲍尔和毕托尼斯塔的建议使用集合。如果你不想使用那个黑匣子,那么这就是你可以做的
# 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
Out[1]:[1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0]通过使用并减去97('a'=97,'b'=98等)将小写字符转换为unicode索引,可以将其直接转换为基于0的索引:
您绝对应该避免在字符串中循环26次来逐个计算每个字母 通过使用并减去97('a'=97,'b'=98等)将小写字符转换为unicode索引,可以将小写字符直接转换为基于0的索引:
您绝对应该避免在字符串中循环26次来逐个计算每个字母 要计数字母,您有许多选项,按优先顺序排列:
collections.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})
这种方法存在一些问题;最大的一个问题是,它只适用于某些单词,而不适用于诸如hello world
之类的短语,也不适用于连接词或标点符号:我们赢了代码>
您可以随时围绕这些进行编程,但其他方法没有这些问题。要计算字母数,您有许多选项,按优先顺序排列:
collections.Counter
如果您想快速完成此操作
使用字典(这是计数器所做的)
使用(零)填充列表-您的方法
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})
这种方法存在一些问题;最大的一个问题是,它只适用于某些单词,而不适用于诸如hello world
之类的短语,也不适用于连接词或标点符号:我们赢了代码>
您可以随时围绕这些问题进行编程,但其他方法没有这些问题。
- 这是一个简单的方法来计算一个字符中每个字符的频率
使用java编程的字符串
- 注意:它按字母顺序给出输出,而不是按字母顺序
发生
- 例如:输入:“你好”输出:e=1H=1L=2O=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);
}
class字符频率
{公共静态void main(字符串s)
{s=s.toLowerCase();
对于(字符i='a';i
- 这是一个简单的方法来计算一个字符中每个字符的频率
使用java编程的字符串
- 注意:它按字母顺序给出输出,而不是按字母顺序
发生
- 例如:输入:“你好”输出:e=1H=1L=2O=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);
}
class字符频率
{公共静态void main(字符串s)
{s=s.toLowerCase();
for(char i='a';i使用collections.Counter
是计算序列中出现次数的最常用方法。您还可以在字母\u Counter
上执行for循环,确保将每个索引转换为具有chr(ord('a'+i))的字符
。使用集合。计数器
是计算序列中出现次数的最常用方法。您还可以在字母计数器上执行for循环,确保使用chr(ord('a'+i))
将每个索引转换为char。啊,很公平,我主要是想看看是否可以使用for循环:)啊,很公平,我主要只是想看看是否可以用for循环来完成:)非常感谢!你知道我如何用句子来完成这项工作吗?当我尝试用空格来完成一个句子时(例如“你好,再见”),它会返回关键错误:“我试图使用.strip()和.replace(),但这不起作用。@maio123maio:你应该添加“如果char!=”:“使其成为sur