首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带重复项的随机分区列表

不带重复项的随机分区列表
EN

Stack Overflow用户
提问于 2017-04-12 00:27:27
回答 1查看 264关注 0票数 1

我有一个数组,其中包含一组数字的n时间。使用n=2的示例

代码语言:javascript
复制
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

我想要的是这个数组的分区,其中分区的成员

  • 包含从数组中随机抽取的元素。
  • 不包含重复项
  • 包含相同数量的元素(直到四舍五入) k

k=4的示例输出

代码语言:javascript
复制
[[3,0,2,1], [0,1,4,2], [3,4]]

k=4的无效输出

代码语言:javascript
复制
[[3,0,2,2], [3,1,4,0], [1,4]]

(这是一个分区,但分区的第一个元素包含重复项)

实现这一目标的最重要的方式是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-12 00:38:15

可以使用collections.Counterrandom.sample的组合:

代码语言:javascript
复制
from collections import Counter
import random

def random_partition(seq, k):
    cnts = Counter(seq)
    # as long as there are enough items to "sample" take a random sample
    while len(cnts) >= k:
        sample = random.sample(list(cnts), k)
        cnts -= Counter(sample)
        yield sample

    # Fewer different items than the sample size, just return the unique
    # items until the Counter is empty
    while cnts:
        sample = list(cnts)
        cnts -= Counter(sample)
        yield sample

这是一个生成器,yield是示例,所以您可以简单地将它转换为list

代码语言:javascript
复制
>>> l = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

>>> list(random_partition(l, 4))
[[1, 0, 2, 4], [1, 0, 2, 3], [3, 4]]

>>> list(random_partition(l, 2))
[[1, 0], [3, 0], [1, 4], [2, 3], [4, 2]]

>>> list(random_partition(l, 6))
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

>>> list(random_partition(l, 4))
[[4, 1, 0, 3], [1, 3, 4, 0], [2], [2]]

最后一个例子表明,如果函数中的“随机”部分返回“错误”样本,该方法可能会给出奇怪的结果。如果这种情况不应该发生,或者至少不经常发生,那么您需要弄清楚如何对样本进行加权(例如,使用random.choices)来最小化这种可能性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43358302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档