【问题标题】:Build unique & random subset from the list从列表中构建唯一且随机的子集
【发布时间】:2020-04-02 04:48:32
【问题描述】:

我想创建一个不允许重复项的子集列表,这里是我的示例代码

import random
idx = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,21,22,23,24,25,26,27,28,29,30)
n = 3
selected_unique_subset = []
for i in range(n):
    selected_unique_subset.append(set(random.choices(idx, k=int(len(idx) / n))))
print(selected_unique_subset)

输出: 从下面的列表中,子集在第一个子集 {2, 5, 7, 12, 19, 25, 28, 29} 中有重复的元素 2 和最后一个子集{2, 7, 15, 17, 21, 24, 26, 27, 30} 中的2,例如

[
{2, 5, 7, 12, 19, 25, 28, 29}, 
{8, 12, 14, 15, 16, 18, 19, 21, 24, 28}, 
{2, 7, 15, 17, 21, 24, 26, 27, 30}
]

期待:

我希望每个子集不应该包含重复项,它应该是随机且唯一的。

谁能给我一些建议来解决这个挑战?

【问题讨论】:

  • id 覆盖内置函数,仅供参考。为什么不选择子列表,然后在上面使用set
  • 编辑后问题描述不清楚。当您谈论随机子集时,为什么只有 3 个子集?而且“独特”一词也很模糊。

标签: python python-3.x algorithm random


【解决方案1】:

使用 set 作为初始值。

import random
idx = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 26, 27, 28, 29,
       30}
n = 3
k = int(len(idx) / n)
selected_unique_subset = []
for i in range(n):
    subset = set(random.choices(list(idx), k=k))
    idx -= subset
    selected_unique_subset.append(subset)
print(selected_unique_subset)

结果:

[
  {1, 3, 5, 8, 15, 21, 22, 28}, 
  {7, 10, 13, 16, 19, 23, 27}, 
  {4, 11, 12, 17, 25, 30}
]

【讨论】:

  • 为什么任何子集中都缺少数字 2
  • 还有为什么数字 6 从任何子集中都丢失了,这不应该丢失。
  • 也缺少号码9
  • @kn3l 无论如何,您的整体方法都不正确。如果我理解正确,您想将原始集合分成 3 个随机混合。但是random.choises() 函数可以从提供的集合中多次选择一个值。这就是您的结果集没有预期的长度 10 的原因。所以更好的方法是使用一些随机化器混合原始列表,然后将其分成相等的部分
  • 使用random.shuffle()对原始列表进行洗牌,然后将其拆分为n部分
猜你喜欢
  • 2022-01-18
  • 2012-03-27
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 2012-10-05
  • 1970-01-01
相关资源
最近更新 更多