【问题标题】:How to Count Most & Least Common Characters in Input?如何计算输入中最常见和最不常见的字符?
【发布时间】:2013-08-15 00:59:52
【问题描述】:

这是我的任务:

编写一个程序,从键盘读取文本,直到出现 找到感叹号 ('!')。

使用由字母“A”到“Z”下标的整数数组, 计算每个字母出现的次数。在一个单独的柜台, 还要计算“其他”字符的总数。

打印出找到最多的字母。 (注意可能有 多于一个附有最大计数的字母。) 另外,打印出哪个字母(或多个字母)找到的数字最少 次,但一定要排除在 全部。

这是我的代码:

msg = input("What is your message? ")

print ()

num_alpha = 26
int_array = [0] * num_alpha
vowel = [0] * 10000
consanant = [0] * 10000

for alpha in range(num_alpha):
    int_array[alpha] = chr(alpha + 65)
    if int_array[alpha] == 'A' or int_array[alpha] == 'E' or int_array[alpha] == 'I' or int_array[alpha] == 'O' or int_array[alpha] == 'U':
        vowel[alpha] = int_array[alpha]
    else:
        consanant[alpha] = int_array[alpha]



print()

lett = 0
otherch = 0
num_vowels = 0
num_consonants = 0

count_character = [0] * 100000

length = len(msg)

for character in msg.upper():
    if character == "!":
        otherch = otherch + 1
        count_character[ord(character)] = count_character[ord(character)] + 1
        break
    elif character < "A" or character > "Z":
        otherch = otherch + 1
        count_character[ord(character)] = count_character[ord(character)] + 1
    else:
        lett = lett + 1
        count_character[ord(character)] = count_character[ord(character)] + 1
        alpha = ord(character) - ord('A')
        if vowel[(alpha)] == (character):
            num_vowels = num_vowels + 1
        else:
            num_consonants = num_consonants + 1

print()

print("Number of Letters =", lett)
print("Number of Other Characters = ", otherch)
print("Number of Vowels = ", num_vowels)
print("Number of Consanants = ", num_consonants)

print()

for character in msg.upper():
        print("Character", character, "appeared" , count_character[ord(character)] , "time(s).")
        if character == "!":
            break

print()

max_letter = -999999999999

min_letter = 999999999999

count_hi = 0

count_low = 0

for character in msg.upper():
    if count_character[ord(character)] > max_letter:
        max_letter = count_character[ord(character)]
        count_hi = count_hi + 1

print("Character" , msg[count_hi + 1] , "appeared the most. It appeared", max_letter, "times.")

print(count_hi)

for character in msg.upper():
    if count_character[ord(character)] < min_letter:
        min_letter = count_character[ord(character)]
        count_low = count_low + 1

print("Character" , msg[count_low + 1] , "appeared the least. It appeared", min_letter, "times.")


print(count_low)

我知道计数器完全错误,但我似乎无法弄清楚。有什么想法吗?

编辑:

如果我输入字符串:“AAAAAAAAAAAAAAAAAAAaaaaaaaaaaHHHHHh!”

打印出来:

字符 A 出现最多。它出现了 29 次。 1 字符A出现的最少。出现了1次。 3

显然第一个字符串是正确的,但第二个应该说字符 h 出现的次数最少。

【问题讨论】:

  • 当你给它特定的输入时会发生什么?结果与您的预期有何不同?
  • 元音/辅音计数未出现在任务摘要中。
  • 我已经更新了描述,我只在问题中加入了必要的部分说明,这是程序的最后一部分。

标签: python arrays counter subscript


【解决方案1】:

在区块中

for character in msg.upper():
    if count_character[ord(character)] > max_letter:
        max_letter = count_character[ord(character)]
        count_hi = count_hi + 1

count_hi 将是不同字母被选为计数最高的字母的次数,而不是字母的索引。只需保存字符以供以后输出,例如

for character in msg.upper():
    if count_character[ord(character)] > max_letter:
        max_letter = count_character[ord(character)]
        high_letter = character

print("Character" , high_letter , "appeared the most. It appeared", max_letter, "times.")

类似地更改低位检查,您应该会回到您想要的位置

【讨论】:

    【解决方案2】:

    最常出现的项目是寻找模式。假设列表已排序,以下将起作用:

    def get_mode(list):
       current_mode = list[0]
       new_mode = current_mode
       mode_count = 1
       top_count = 1
    
       for idx in range(0, len(list)):
          if list[idx] == modeChar:
             mode_count += 1
          else:
             if mode_count > top_count:
                new_mode = current_mode
                top_count = mode_count
    
             current_mode = char
             current_count = 1
    
       if mode_count > top_count:
          new_mode = current_mode
          top_count = current_count
    
       return new_mode, top_count
    

    您可以很容易地使用最小逻辑 - 假设第一项是最少出现的,像模式一样跟踪它的计数,并将其存储在更改中。您需要在循环之后进行检查,以确保如果列表中最后排序的项目序列的计数小于存储的最小计数,则您将该项目及其计数设置为正确的值。只需将最终值附加到 return 语句,您就有一个包含 (mode, mode_count, least-occuring, least_count) 的元组。

    由于这看起来像是一项家庭作业,我没有对最小材料进行编码,并且我还假设您不允许执行涉及某些导入库的简单单行。如果您被允许使用它,那么我建议您使用Counter.

    【讨论】:

      【解决方案3】:

      第一个字符串完全是运气。每当您看到一个字符出现的次数超过前一个最大值,然后使用原始消息中的该索引作为最常见的字符时,您就会增加 count_hi。这是没有意义的。如果您将字符串中的第三个A 替换为B,结果将显示“字符B 是出现次数最多的字符,出现了28 次”(因为B 将位于索引2,它仍然是count_hi + 1 的值)。

      您的代码有很多需要改进的地方,但是如果您将count_hi = count_hi + 1 替换为max_chr = character,然后打印max_chr 而不是msg[count_hi + 1],您可以轻松获得正确的输出。然后您可以对min_chr 执行相同的操作,但请记住,根据您编写代码的方式,它会说! 出现频率最低,只有1 次。你需要先去掉!,或者使用不同的方法(你可以很容易地做到这一点,因为你已经知道了每个字符的计数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 2015-02-18
        相关资源
        最近更新 更多