【问题标题】:Re-keying a dictionary重新键入字典
【发布时间】:2012-04-17 01:33:51
【问题描述】:

所以我有一个 Python 任务,我需要使用字典来保存菜单项,然后随机重新键入并重新排序菜单,以便我可以更改打印出来的菜单选项的顺序。这是我的代码示例:

ChoiceOne = "Rekey Menu"
ChoiceTwo = "Quit"
menu = {'1':ChoiceOne, '2':ChoiceTwo,}
userChoice = input("Please Enter the Integer for Your Menu Choice: ")

while userChoice not in menu.keys():
    print("Invalid Input")
    userChoice = input("Please Enter the Integer for Your Menu Choice: ")

if menu[userChoice] == ChoiceOne:
    menu = rekey(menu)
elif menu[userChoice] == ChoiceTwo:
    quit()

上面的代码在用户选择不退出时循环,一遍又一遍地打印出菜单。以下是我的 rekey() 函数

def rekey(menu):
    rekey = {}
    keylist = random.sample(range(10), 2)
    for i, item in zip(keylist, menu ):
        rekey[i] = menu[item]
    return rekey

我的问题似乎出现在我检查菜单选项的用户输入是否有效的行中。最初,输入“1”或“2”以外的任何内容都会导致程序进入 While 循环,直到输入有效输入。然而,在重新输入菜单后,“当 userChoice 不在 menu.keys() 中时”行总是被触发,并且没有匹配的输入来继续程序。

我试图通过打印字典中的新键并检查 userChoice 是否与其中任何一个匹配来找到问题,但即使我选择了一个有效的新键,程序似乎也认为什么都没有我输入的是一个有效的密钥。

我希望我已经把问题描述得足够好,以便理解,提前感谢您的帮助!

【问题讨论】:

  • 无视我的回答。我想了一会儿,意识到这是完全错误的。请投票 2 删除。
  • menu[userChoice] 的检查应该在 while 循环内(即在发布期间搞砸了)还是在外面?如果是后者,那么我看不到在重新键入后再次提示的外部循环...
  • 您可以在rekey() 中更简单地构建字典:return dict(zip(random.sample(range(10), 2), menu))。或者更确切地说,解决问题:return dict(zip(map(str, random.sample(range(10), 2)), menu))。 ;)

标签: python random dictionary


【解决方案1】:

在您的第一种情况下,菜单键是 strings,在 rekey 之后它们是 ints。您需要对键或用户输入进行转换,以便它们匹配。

【讨论】:

  • 感谢您的帮助!当我将“rekey[i] = menu[item]”更改为“rekey[str(i)] = menu[item]”时,问题就解决了
【解决方案2】:

根据documentationinput(x) 函数等价于eval(raw_input(x))。这意味着在输入提示符下输入“1”相当于在python解释器中输入“1”,所以你得到整数 1。

正如 SpliFF 已经指出的那样,您需要确保在菜单字典中使用整数键,或者您可以对字典使用字符串键并切换到使用 raw_input 函数来读取用户的选择.

【讨论】:

  • 注意:input()raw_input() 在 Python 2 中的行为方式是这样的。OP 将 print 用作函数 print() 表明他可能正在使用 Python 3.
  • 嗯,是的,我认为您可能是对的。还要注意使用range 而不是xrange,这也表明正在使用Python 3。
  • 这绝对是 Py3,或者 rekey 永远不会被调用,因为最初的 dict 键是字符串。
  • 对周围的一切进行敏锐而准确的观察。很高兴看到这里的每个人都对这些主题充满热情,能够深入阅读代码。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
相关资源
最近更新 更多