【问题标题】:Random pop from dict, serving values, not keys从 dict 随机弹出,提供值,而不是键
【发布时间】:2017-07-24 16:16:52
【问题描述】:
item = word_bank.pop(random.choice(list(word_bank.keys()))) 
print(list(word_bank.keys()))
print("The Word is: ", item)
print("=" * 25)
a = input("Do You Know It? (y/n):\t")
answer = word_bank[item]

上面的item 变量返回值而不是我的word_bank 字典中的键。我打印了我的键列表来尝试调试问题并且不存在任何值,这让我认为pop 方法或random.choice 方法存在问题。我查看了这两个文档,没有发现任何可以指出问题的地方。

我认为这与 random.choices 返回一个键的索引,然后 pop 方法将相应的值作为项返回到该键有关。但是,当我颠倒角色并使用values() 代替keys() 时,我得到一个关键错误并且找不到解决问题的有效解决方案。

【问题讨论】:

  • ...不存在值,你知道dict.pop 是做什么的吗?
  • 你到底想做什么?是的,如果你将一个键传递给.pop 方法,它pops 对应的值...

标签: python dictionary random key


【解决方案1】:

word_bank.keys() 显然返回键,如果有的话。 word_bank.pop 将返回给定键的值。因此,item 将包含来自 word_bank 的值。 但是,当我反转角色并使用 values() 代替 keys() 时,我得到一个键错误,这是因为您试图使用值搜索键。字典只能按键而不是按值直接索引。 检查这个:

word_bank = {'one':1,'two':2,'three':3}
item = word_bank.pop(random.choice(list(word_bank.keys())))
print(list(word_bank.keys()))
print("The Word is: ", item)
print("=" * 25)
a = input("Do You Know It? (y/n):\t")
answer = item

【讨论】:

    【解决方案2】:
    word_bank = {'hello':'goodbye','yes':'no'}    
    
                item = random.choice(list(word_bank.items()))
                  key = item[0]
                  value = item[1]
                  print("The Word is: ", key)
                  print("=" * 25)
                  a = input("Do You Know It? (y/n):\t")
                  answer = value
                if a.lower() == "y":
                      print()
                      print("Answer:\t", answer)
                      score += 1
                      del word_bank[key]           #remove from dict 
                      print()
                elif a.lower() == "n":
                      print()
                      print("Answer:\t", answer)
                      del word_bank[key]            #remove from dict
                      print()
    

    我想出了这个解决方案,但它似乎不是很有效,谁能提供一种方法来破坏性地遍历我的字典,使用更少的行或提供更多的可读性?我的直觉说pop,但这仅适用于键而不是值,我需要删除并返回一个键给用户,然后向他们显示值。上面的示例有效,但看起来很庞大。

    【讨论】:

    • 所以,如果他们声称知道答案,即使没有检查答案,你就是在给他们一分?
    • 该程序仅供我使用,我正在浏览不同语言的单词词典,键是外语,值是英语定义。它仅供我使用,因此此时检查响应确实不是问题。
    • 为什么是破坏性的?你是只回答一部分,其余部分做点什么吗?
    • 没有什么特别的原因,除了,我只是不想在我的 random.choice 单词中循环时收到重复。我想我可以让它成为一个循环,这样会更好吗?
    【解决方案3】:

    随机选择一个键然后pop()答案:

    import random
    
    word_bank = {'hello':'goodbye','yes':'no'}
    score = 0
    item = random.choice(list(word_bank.keys()))
    answer = word_bank.pop(item)
    print("The Word is: ", item)
    print("=" * 25)
    a = input("Do You Know It? (y/n):\t")
    if a.lower() == "y": score += 1
    print()
    print("Answer:\t", answer)
    

    上面的代码在每个阶段都会改变字典。例如,如果你想再次运行测验吗?我不喜欢无缘无故地破坏信息。这是整个测试的非破坏性版本,它对键进行洗牌,因此在不同的运行中给出不同的命令(请注意,我省略了变量answer,因为我只需要一行代码中的值):

    import random
    
    word_bank = {'hello':'goodbye','yes':'no'}
    score = 0
    questions = list(word_bank.keys())
    random.shuffle(questions)
    for item in questions:
        print("The Word is: ", item)
        print("=" * 25)
        a = input("Do You Know It? (y/n):\t")
        if a.lower() == "y": score += 1
        print()
        print("Answer:\t", word_bank[item])
    
    print("Final score =",score)
    

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 1970-01-01
      • 2020-12-16
      • 2016-11-13
      • 2018-07-27
      • 2011-06-19
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多