我写了一个函数来计算给定字符串中单个字母的出现次数:
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循环的问题,但似乎更复杂。或者我可能已经看了太久了。
提前致谢。
答案 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)
要计算字母数,您可以按优先顺序选择多种选项:
collections.Counter
如果你想快速完成这项工作。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})
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)
例如:输入:“ 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);
}
}