程序正在重演 - 无法弄清楚原因

时间:2016-10-28 00:04:12

标签: python function for-loop repeat

这是我的程序到目前为止...它接收一条消息(来自用户的输入)并告诉用户程序中有多少A,有多少B等等。除非我输入诸如“爸爸”之类的消息,它会告诉我有多少D有两次,而不是只说一次。 它说:

D ... 2

A ... 1

D ... 2

我想说:

A ... 1

D ... 2

如何在不使用zip的情况下修复此问题,而无需导入任何内容?

message=input("what is your message?").upper()
alphabet=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
count=[0]*len(alphabet)
for i in message:
    if i in alphabet:
        count[alphabet.index(i)]+=1

for i in message:
    print (i,"...",count[alphabet.index(i)])

(感谢Uriel Eli帮助我完成了这个程序)。

3 个答案:

答案 0 :(得分:2)

我不同意你的做法。你实际上已经过度复杂了。解决这个问题的正确方法是实际使用字典来跟踪字符串中的所有字母,并在每次出现相同字符时保持计数。注意,这也坚持不导入任何东西的规则。

此外,这也消除了检查字母列表的必要性。

此外,如果您需要分别计算大写和小写字符,请不要在输入结束时调用upper。只需删除它。如果你必须将大小写计算为相同的字符,那么你可以保留它。

message=input("what is your message?").upper()

d = {}

for c in message:
    if c in d:
        d[c] += 1
    else:
        d[c] = 1

演示

what is your message?thisisastringofthings
{'H': 1, 'F': 0, 'O': 0, 'R': 0, 'G': 1, 'S': 3, 'T': 2, 'A': 0, 'I': 3, 'N': 1}

要提供类似于您期望的输出,您只需要遍历最终结果并打印:

表示字符,以d.items()计数:     print(“{} ... {}”。format(character,count))

最后,只是为了显示 最佳方法,实际使用来自Counter的{​​{1}}:

collections

答案 1 :(得分:1)

仅供将来参考,我知道您现在无法导入任何内容。最好的方法可能是:

from  collections import Counter
message=input("what is your message?").upper()
print(Counter(message))
# Counter({'D': 2, 'A': 1})

答案 2 :(得分:0)

你的第二个for循环正在迭代message,所以如果用户输入DAD(好......在上面封装它之后),你就会得到:

message == DAD
  i = D --> Shows 2
  i = A --> Shows 1
  i = D --> Shows 2 (again)

也许你想要遍历count,保留你正在迭代的索引(使用后者将其与alphabet列表匹配)。这样的事情:

for index, num_occurences in enumerate(count):
    if num_occurences > 0:
        print("Match found at i=%s which corresponds with alphabet[%s]=%s" %
              (index, index, alphabet[index]))
        print(alphabet[index], "...", num_occurences)

您应该检查enumerate的内容。

如果您仍希望遍历message,则可以执行此操作,使用辅助set跟踪您已显示的字母(因此您不会再次显示相同的字母)

already_shown_letters = set()
for i in message:
    if i not in already_shown_letters:
        print (i,"...",count[alphabet.index(i)])
        already_shown_letters.add(i)