获取字典的随机子集

Del*_*aIV 5 python random dictionary

免责声明:我知道有一个问题叫做

获取 dict 的随机样本

但很明显,我的不是重复的。该问题的答案主要集中在计算字典的随机子集的值的总和,因为这正是 OP 真正想要的。相反,我真的需要提取一个子集。

我有一个非常大的字典,我想提取一个子样本,然后我想对其进行迭代。我试过:

import random
dictionary = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
keys = random.sample(dictionary, 3)
sample = dictionary[keys]
Run Code Online (Sandbox Code Playgroud)

但它不起作用:

Traceback (most recent call last):
  File "[..]/foobar.py", line 4, in <module>
    sample = dictionary[keys]
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

这有效:

import random
dictionary = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
keys = random.sample(dictionary, 3)
sample = {key: dictionary[key] for key in keys}
Run Code Online (Sandbox Code Playgroud)

这似乎有点词性:我希望有一种矢量化的方式来构建新词典。但是,这是正确/最 Pythonic 的方法吗?另外,如果我想迭代这个样本,我应该这样做:

for key, value in sample.iteritems():
    print(key, value)
Run Code Online (Sandbox Code Playgroud)

我的问题不是重复

如何在字典python中随机选择多个键及其值

要么,因为该问题的答案并没有完全解决我的问题。这比我的尝试更糟糕:它没有创建示例字典,而是对键进行采样,然后分别检索值。这显然不是很pythonic,我明确要求提供pythonic答案。

tim*_*geb 8

dict(random.sample(dictionary.items(), N))
Run Code Online (Sandbox Code Playgroud)

您可以N从字典中选择随机(键,值)对并将它们传递给dict构造函数。

演示:

>>> import random
>>> dictionary = dict(enumerate(range(10)))
>>> dictionary
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>> N = 3
>>> dict(random.sample(dictionary.items(), N))
{3: 3, 6: 6, 9: 9}
Run Code Online (Sandbox Code Playgroud)

  • 这个问答有点旧,现在引发了“DeprecationWarning:从 Python 3.9 以来已弃用的集合中采样,并将在后续版本中删除。”最简单的修复方法是用“list(...)”调用包装 (2认同)