【问题标题】:sample a single element from each key of dictionary randomly从字典的每个键中随机采样一个元素
【发布时间】:2020-09-07 14:56:57
【问题描述】:

我有一个字典,其中键代表组,值是元素列表(为简单起见,我们假设值是整数)。

这样的字典的一个例子,d,是:

d = {2: [0, 1, 7, 8, 9], 1: [2, 4], 4: [3], 3: [5, 6]}

我希望对这本字典进行多次随机抽样,其中样本将包括对第一组中的单个元素、第二组中的单个元素等的随机抽样。

简单的输出示例是:

[9, 2, 3, 5]
[1, 2, 3, 6]
[7, 4, 3, 6]
...

我可以遍历字典,dM 次并遍历键和样本 1 元素,我想知道是否有更简单的方法,希望更有效,因为它将成为更大更复杂的算法。

天真的方法是:

ll = []
    for i in range(10):
        tmp = []
        for k, l in d.items():
            tmp.append(random.choice(l))
        ll.append(tmp)
    print(ll)  # [[5, 6, 9, 7], [8, 4, 3, 7], [2, 1, 3, 7], [5, 1, 3, 7], [0, 4, 3, 7], [2, 1, 3, 7], [2, 6, 9, 7], [2, 1, 9, 7], [8, 4, 9, 7], [2, 1, 9, 7]]

我对字典并不严格,我也可以使用其他结构,但逻辑保持不变。

不胜感激。

【问题讨论】:

  • 检查random.samplerandom.choice:docs.python.org/3/library/random.html
  • @Mike67 是的,我对它们很熟悉,看看我的幼稚方法。我一直在寻找一种不同的方法。
  • 您想要一个不使用random 库的选项?
  • @Mike67 不,我想要一个不需要遍历键的选项。

标签: python dictionary random


【解决方案1】:

实际上没有其他选择,因为您正在使用字典和列表。正如您所提到的,您必须遍历字典值M 次,并在每次迭代中获取每个内部列表的random.choice。一个简单的方法是:

from random import choice
n = 5
l = list(d.values())
[list(map(random.choice, l)) for _ in range(n)]
# [[9, 2, 3, 6], [7, 2, 3, 5], [9, 4, 3, 5], [0, 2, 3, 5], [7, 4, 3, 5]]

另一种方法是使用random.choices 从内部列表中进行替换,然后使用zip转置生成的嵌套列表。这样,我们将上面的内容简化为对值的单次迭代:

from random import choices
list(zip(*(random.choices(i, k=n) for i in l)))
# [(8, 4, 3, 5), (1, 2, 3, 6), (9, 4, 3, 6), (1, 2, 3, 5), (8, 4, 3, 5)]

【讨论】:

  • 漂亮的单线。我想没有比这更简单的方法了。您认为使用pandas 是否值得?
  • 可能有点矫枉过正@DavidS 我个人会为此列出清单
  • 您的意思是列表列表吗?我根据scipy.cluster.hierarchy.cut_tree 的输出构建了字典,以便将我的原始元素列表拆分为具有适当类的组。我计算距离矩阵 -> 层次聚类 -> 将树切割为k 组,然后构建字典
  • 是的列表列表,仍然来自列表类@DavidS
【解决方案2】:

这应该可行:

import random

result=[]
for i in range(M):
    result.append([random.choice(d[i]) for i in d])

【讨论】:

  • 你还不如使用内置的random,不需要numpy
  • 是的,我已经修改过了。我通常使用 numpy,这就是为什么它作为首选,谢谢
  • @archer 是的,这是我使用的“天真”方式的变体,我希望有一种更简单的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2012-08-09
  • 2016-09-06
  • 2017-01-26
  • 2020-10-05
  • 1970-01-01
相关资源
最近更新 更多