计算字符串列表出现在字符串中的次数 - Python(无计数或计数器)

时间:2017-11-23 15:30:09

标签: python string list count

我是一名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:列表索引超出范围

我知道我搞糟了。但无论我做什么,我似乎都无法让它发挥作用。请帮忙!

4 个答案:

答案 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个独特的字符)。

这是您的代码的修改版本。它效率不高,但它有效并且不需要dictCounter 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_listletter_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

您会发现将来使用词典和计数器可以轻松完成此类任务。