【问题标题】:How can i find the key of a random picken value from a dictionary in Python?如何从 Python 中的字典中找到随机选取值的键?
【发布时间】:2022-01-20 13:44:21
【问题描述】:

我是 Python 的初学者。我制作了一本列表字典。我想选择一个随机值,然后知道该值的键。那可能吗? 例如

`lex = {"q1": [["B",  "A", "C", "D"],["2" ,"D"]],
       "q2": [["C", "A", "Z", "D"],["W","K"]],
       "q3": [["A", "K", "D", "C"],["me", "S"]],
       "q4": [["B", "L", "A", "F"],[ "1974", "D"]]}

        lex_list = list(lex.values())
        pick_value = random.sample(lex_list,1)`

有没有办法知道哪个是随机值的键?我的目的是从列表中删除该pick_value。非常感谢任何建议。谢谢。

【问题讨论】:

  • 看起来你有一个潜在的目标,它是什么?遍历字典以从值中获取键是低效的(并且在存在重复值的情况下模棱两可)。你真正想在这里实现什么? ;)
  • 我正在尝试进行多项选择测验。假设我在字典中有 50 个问题。在这 50 个问题中,例如应随机选择 10 个。但是每次选择一个问题,我都想从列表中删除。
  • 你可以只使用问题索引,不需要删除;生成 10 个 1 到 50 之间的随机数并通过 id 获取这些问题
  • @Drako Nice 认为..如果我的策略不起作用,我也会对此进行测试。谢谢
  • 即使在只有 50 个条目的特定情况下,这也比操作字典更便宜 - 可能并不重要:)

标签: python python-3.x list dictionary


【解决方案1】:

我了解您的目标是找到所选随机值的键,然后将其删除。下面的代码就是这样做的。还要记住是否有重复的值 在您的字典中,该代码将删除找到该值的第一个键:值对。

在重复的情况下,需要找到所有键的列表,然后在单独的 for 循环中删除。 pick_value 是一个嵌套列表,因此 pick_value[0] 在这里工作。

生成的 new_list 删除了 pick_value。

for key,value in lex.items():
  if value == pick_value[0]:
    lex.pop(key)
    break
new_list = list(lex.values())

    

【讨论】:

  • 谢谢哈蒂姆。这很有帮助。在我的字典中没有相同的键或值,这就是我想到这个策略的原因。
【解决方案2】:

如果您对键随机选择的值都感兴趣,那么为什么不考虑随机选择一个键并收集该键的值呢?

import random
lex = {"q1": [["B",  "A", "C", "D"],["2" ,"D"]],
       "q2": [["C", "A", "Z", "D"],["W","K"]],
       "q3": [["A", "K", "D", "C"],["me", "S"]],
       "q4": [["B", "L", "A", "F"],[ "1974", "D"]]}

# Randomly pick one key
r_key = random.choice(list(lex.keys()))
# Get the value corresponding to that key
r_value = lex[r_key]
print(r_key, r_value)

这使用random.choice 从可迭代对象中选择一个元素。 这输出:

q4 [['B', 'L', 'A', 'F'], ['1974', 'D']]

如果您真的宁愿继续您已经拥有随机值的策略,但想要相应的随机键,那么这可能会起作用:

import random
lex = {"q1": [["B",  "A", "C", "D"],["2" ,"D"]],
       "q2": [["C", "A", "Z", "D"],["W","K"]],
       "q3": [["A", "K", "D", "C"],["me", "S"]],
       "q4": [["B", "L", "A", "F"],[ "1974", "D"]]}

lex_list = list(lex.values())
pick_value = random.sample(lex_list,1)

# Find the corresponding key(s)
keys = [key for key, value in lex.items() if value == pick_value[0]]
print(keys)

这输出例如['q2']。请记住,我一直将 keys 称为多个,因为理论上多个键可能对应于相同的值。如果您的程序中没有发生这种情况,那么您可以将keys[0] 作为您的密钥。

该策略使用列表推导循环遍历来自lex 的键值对,然后过滤value 对应的pick_value

再次,我推荐第一种策略。

【讨论】:

  • 谢谢,很好的回答。我知道我可以做到这一点,但对于我的代码而言,它不是一个有用的方法。我必须重新排列整个算法。
  • 这是可以理解的@fotonio。我已经编辑了我的答案,以包含一种替代方法,它可以准确地回答你所追求的(或者我希望如此)。
  • 再次感谢汤姆。键是我字典中问题的数量,因此没有相同的键或值。我的策略是每次随机选择时从列表(不是字典)中删除值。当通过随机选择同一问题被问两次时,问题就出现了。
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 2013-09-28
  • 2023-03-10
  • 1970-01-01
  • 2021-05-25
  • 2015-01-09
  • 2014-03-22
  • 2016-09-06
相关资源
最近更新 更多