【问题标题】:Program is repeating itself -can't figure out why程序在重演——不知道为什么
【发布时间】:2016-10-28 00:04:11
【问题描述】:

到目前为止,这是我的程序...它接受一条消息(来自用户的输入)并告诉用户程序中有多少个 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 帮助我完成了这个程序)。

【问题讨论】:

  • 您可以将字母表作为字符串而不是字符数组:'ABCDE'

标签: python function for-loop repeat


【解决方案1】:

我不同意你在这里的做法。你实际上把这个复杂化了。解决这个问题的正确方法是实际使用字典来跟踪字符串中的所有字母,并在每次出现相同字符时进行计数。请注意,这也遵守不导入任何内容的规则。

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

另外,如果您需要分别计算大小写字符,请不要在输入结束时调用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))

最后,为了展示 最好的方法,实际上是使用来自collectionsCounter

>>> from collections import Counter
>>> Counter("thisisastring")
Counter({'s': 3, 'i': 3, 't': 2, 'h': 1, 'n': 1, 'a': 1, 'r': 1, 'g': 1})

【讨论】:

  • 感谢编辑。你显然比我更有经验。第一天:)
  • 没问题。我们都从某个时候开始。问题。需要分别计算大小写,还是'a'和'A'一样算?
  • 是一样的——只是字母表,我在打印时使用大写。
  • 那么这就是你所需要的。如果答案对您有帮助,您应该通过勾选答案旁边的复选标记来接受它。
  • @jason 不客气。祝你好运。尽量不要气馁。你会得到它的窍门。保持。 :)
【解决方案2】:

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

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

【讨论】:

  • 大家点赞! :) 希望我的信息没有被视为粗鲁或任何东西。只是想提一下,以防你没看过。
  • @idjaw 都很好。当少数人同时在一个解决方案上工作时,相同/相似的多个回答者很常见。
【解决方案3】:

您的第二个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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多