我是一名Python新手,参加课程。我必须找出每个字母出现在字符串中的次数。我已经看到了关于.count和counter的所有回复,但这还没有被讨论过。我拿了我的字符串并创建了一个字符列表,所以它们只出现一次。然后我试着计算字符串中的字符出现在字符串中的次数,而我无法让它工作。我知道如何检查特定的字母,但我无法检查列表中的每个字母。程序在下面(有一些额外的代码,但我用它们来确保它正确计数)。
# CONSTANTS and Blank Lists
letter_list = []
count = 0
letter_count = []
index = 0
# Begin programming
my_string = 'SUKI IS SWEET'
for ch in my_string:
if ch not in letter_list:
letter_list.append(ch)
print(letter_list)
print()
for ch in my_string:
if letter_list[index] == ch:
count = count + 1
letter_count.append(count)
# Double-checks to make sure running properly
print(letter_list[0],'appears',letter_count[0], 'times')
print()
print(letter_count)
print()
当我运行时,我得到了正确的答案: ['S','U','K','我','','W','E','T'](我的letter_list) S出现3次(S确实出现3次) [3](我的letter_count)
但是,我知道我的letter_count.append在错误的地方。但如果我把它移进去,它就会被抬起来。当我试图通过增加指数来推动它时,它会爆炸(见下文):
# CONSTANTS and Blank Lists
letter_list = []
count = 0
letter_count = []
index = 0
# Begin programming
my_string = 'SUKI IS SWEET'
for ch in my_string:
if ch not in letter_list:
letter_list.append(ch)
print(letter_list)
print()
for ch in my_string:
if letter_list[index] == ch:
count = count + 1
letter_count.append(count)
index = index + 1
# Double-checks to make sure running properly
print(letter_list[0],'appears',letter_count[0], 'times')
print()
print(letter_count)
print()
结果: Traceback(最近一次调用最后一次): 文件“C:\ Users \ Rogue \ Desktop \ TEST_2.py”,第30行,中 主要() 在主文件中输入文件“C:\ Users \ Rogue \ Desktop \ TEST_2.py”,第18行 如果letter_list [index] == ch: IndexError:列表索引超出范围
我知道我搞糟了。但无论我做什么,我似乎都无法让它发挥作用。请帮忙!
答案 0 :(得分:2)
您可以使用字典:
count = {}
my_string = 'SUKI IS SWEET'
for i in my_string:
if i in count: #check if it exists in dictionary
count[i] += 1
else:
count[i] = 1 #first occurrence of character
print(count)
输出:
{' ': 2, 'E': 2, 'I': 2, 'K': 1, 'S': 3, 'U': 1, 'T': 1, 'W': 1}
答案 1 :(得分:2)
index out of range
错误来自index
与原始字符串(13个字符)相比较大的事实,但您在letter_list
上使用它,这个数字很大独特的字符(8个独特的字符)。
这是您的代码的修改版本。它效率不高,但它有效并且不需要dict
或Counter
s:
letter_list = []
letter_count = []
# Begin programming
my_string = 'SUKI IS SWEET'
# Create a list of unique characters
for ch in my_string:
if ch not in letter_list:
letter_list.append(ch)
letter_count.append(0)
# Increment values in letter_count
for ch in my_string:
for index in range(len(letter_list)):
if letter_list[index] == ch:
letter_count[index] += 1
# Double-checks to make sure running properly
print(letter_list)
print(letter_count)
for index in range(len(letter_list)):
print("'" + letter_list[index] + "'",'appears',letter_count[index], 'times')
输出:
['S', 'U', 'K', 'I', ' ', 'W', 'E', 'T']
[3, 1, 1, 2, 2, 1, 2, 1]
'S' appears 3 times
'U' appears 1 times
'K' appears 1 times
'I' appears 2 times
' ' appears 2 times
'W' appears 1 times
'E' appears 2 times
'T' appears 1 times
答案 2 :(得分:1)
如果允许使用Python的内置sorted
函数,有一种非常简单的方法可以执行此操作。
我们从字符串中创建字符的排序列表,然后我们扫描列表,查找字符更改的位置。当我们找到更改时,前一个组已结束,因此我们打印其字符及其计数。
在循环开始时,我们有一个由空字符串组成的假组,因此我们需要跳过该假组的打印步骤。在循环结束时,我们打印最后一组的信息。
my_string = 'SUKI IS SWEET'
last, count = '', 0
for c in sorted(my_string):
if c != last != '':
print(last, count)
count = 0
last = c
count += 1
print(last, count)
<强>输出强>
2
E 2
I 2
K 1
S 3
T 1
U 1
W 1
答案 3 :(得分:1)
主要问题是index
的增量远大于letter_list
的实际大小,这会导致索引错误。您需要确保letter_list
和letter_count
列表是并行且长度相同的,否则可能会发生太多的访问错误。
以下是编写此代码的另一种方法:
def count_frequency(text):
letters = []
freqs = []
ordered_list = sorted(text)
for letter in ordered_list:
if letter not in letters:
letters.append(letter)
freqs.append(1)
else:
letter_loc = letters.index(letter)
freqs[letter_loc] += 1
return letters, freqs
使用相同的方法使并行列表跟踪字母及其各自的频率。它使用sorted
预先对列表进行排序,并返回包含字母和频率的元组。
然后你可以使用zip
很好地打印它,这允许你一次循环两个相同大小的列表:
letter_freqs = count_frequency('SUKI IS SWEET')
for letter, freq in zip(letter_freqs[0], letter_freqs[1]):
print(letter, "appears", freq, "times")
输出:
appears 2 times
E appears 2 times
I appears 2 times
K appears 1 times
S appears 3 times
T appears 1 times
U appears 1 times
W appears 1 times
您会发现将来使用词典和计数器可以轻松完成此类任务。