【问题标题】:Dictionary and elif字典和 elif
【发布时间】:2013-09-21 09:52:34
【问题描述】:

在迈克尔·道森(Michael Dawson)的“绝对初学者的 Python”一书中,在列表和字典一章中,我学到了很多东西,我正在尝试使用旧的 Magic 8-Ball 作为我的灵感来制作一个新程序作为练习.以下是我到目前为止提出的代码。

它在一定程度上起作用...生成了随机生成的数字,但 elif 似乎不起作用。我知道有更好和更简单的方法,但我这样做是为了加强我对字典的理解。

我已经放入了几个打印语句,看看我是否选择了一个数字,而 else 语句是如果一切都变坏了。按照现在的代码,我得到的只是打印的数字,else 产生“不计算。退出工作正常。我还使用注释掉的打印“球”语句确认字典很好。

所以我的问题是为什么 elif 语句似乎没有处理生成的随机数。我衷心感谢和感谢谁回答。

# Import the modules
import sys
import random

 # define magic 8-ball dictionary
ball = {"1" : "It is certain.",
        "2" : "Outlook is good.",
        "3" : "You may rely on it.",
        "4" : "Ask again later.",
        "5" : "Concentrate and ask again.",
        "6" : "Reply is hazy, try again later.",
        "7" : "My reply is no.",
        "8" : "My sources say no"}
# for items in ball.items():
#              print(items)

ans = True

while ans:
    question = input("Ask the Magic 8 Ball a question: (press enter to quit) ")

    answer = random.randint(1,8) 
    print(answer)

    if question == "":
        sys.exit()

    elif answer in ball:
        response = ball[answer]
        print(answer, response)
    else:
        print("\nSorry", answer, "does not compute.\n")    

【问题讨论】:

    标签: python random dictionary


    【解决方案1】:

    random.randint() 返回一个整数。你的字典的键都是字符串。因此,当您执行answer in ball 时,它将始终False,因为"1" != 1

    您可以做的是将所有键设为整数(删除引号),或通过以下操作将answer 设为字符串:

    answer = str(random.randint(1,8))
    

    请注意,您不应在此处使用elif。如果您的输入什么都不是,那么您的ifelif 都将为True,而且大多数时候您不希望这样。相反,请将您的 elif/else 更改为 if/else

    if question == "":
        sys.exit()
    
    if answer in ball:
        response = ball[answer]
        print(answer, response)
    else:
        print("\nSorry", answer, "does not compute.\n")    
    

    最后一件事。 answer 将始终位于 ball 中,因为您动态创建了字典。在这里,您可以使用dict.get()。例如:

    if not question: # You can do this instead
        sys.exit()
    
    print(ball.get(answer))
    

    【讨论】:

    • 非常感谢。基于 cmets 已尝试使用 first str 并成功,然后将 dict 更改为 number 并且效果很好,现在我完全理解我的错误并修复。谢谢大家!
    • @EricBaltrush 非常欢迎您!别忘了accept an answer
    【解决方案2】:

    您正在查找带有数字的字典,而键是字典中的字符串。因此,您必须使用str 将数字转换为字符串。

    改变

    answer = random.randint(1,8)
    

    answer = str(random.randint(1,8))
    

    【讨论】:

    • 就是这样。非常感谢。我现在知道我哪里出错了:混合 str 和 int。
    • @EricBaltrush 不客气 :) 如果有帮助,请考虑投票并接受这个答案作为答案meta.stackexchange.com/a/5235
    • 在几个很棒的答案中,你的答案是第一个,这正是我所需要的。我确实感谢所有贡献者的所有答案。 Python 是一个多么棒的社区。​​span>
    【解决方案3】:

    字符串"1" 不是整数1。所以answer 实际上不在ball 中。 尝试将其转换为answer = str(random.randint(1,8))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 2019-04-29
      • 1970-01-01
      • 2017-05-03
      • 2019-07-10
      • 1970-01-01
      相关资源
      最近更新 更多