从dict中随机弹出,提供值,而不是键

时间:2017-07-24 16:16:52

标签: python dictionary random key pop

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()时,我收到了一个关键错误,无法找到问题的有效解决方案。

有人可以对此有所了解,并帮助我找到最有效的方法吗?

3 个答案:

答案 0 :(得分:0)

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

<PropertyGroup>
  <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\MyProject.xml</DocumentationFile>
</PropertyGroup>

答案 1 :(得分:0)

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,但只适用于键而不是值,我需要删除并向用户返回一个键,然后向他们显示值。上面的例子有效,但看起来很笨重。

答案 2 :(得分:0)

随机选择一个键然后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,因为我只需要一行代码中的值): / p>

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)