我有一个有200个元素的列表。我想随机计算这些元素的所有长度组合的10%,并将结果存储在一个列表中。在
例如:
假设'ABCD'
如['A', 'B', 'C', 'D']
中所示,我想要长度为2的组合。在这种情况下,所有可能的组合都是6(n!/(n-k)!x k!))。我想要10%的0.6->;1(四舍五入)。在
我试过itertools.combinations('ABCD', 2)
,但它给了我所有的组合。在
以下是关于我的问题的更多信息。在
我有
all_points_coordinates = [
[-1.6339171050450814, 2.5160117038362722],
[-1.7207293090531386, 2.4574561328669748],
[0.10469849010750323, 2.9981724810572872],
]
我想计算其中3个的组合并使用
^{pr2}$但它给了我我所有观点的组合。当我运行它100点,这是非常耗时的,所以我只想计算这些组合的有限数量。在
如果您不想在拾取一小部分组合之前预先计算所有组合,则有两个选项:
很难看,但做得很好
美丽而复杂
另一个相当简单的可能性:生成所有的组合,但只保留那些随机变量为
< 0.1
的组合,以获得(大约)10%的结果组合。在与使用
random.sample
相比,它的优点是不需要将所有的组合都保存在内存中,尽管它仍然会生成所有的组合,但会立即丢弃其中的90%。此外,结果将只有大致10%的组合,但不完全是。不过,对于数量庞大的人来说,这应该不是什么大问题。在我们可以使用
random.sample
生成随机组合,并使用一个集合来确保不会多次生成任何组合。下面是一个简单的演示。在输出
^{pr2}$正如tobias_k在评论中提到的,这段代码只适用于
num
不太接近组合总数的情况。如果您想要<;50%的组合,应该没问题,但除此之外,它很有可能重新生成已经生成的组合,这将导致它长时间循环。在注意,这段代码认为
((2, 3), (12, 13), (8, 9))
不同于以不同顺序包含这3对的元组,例如((2, 3), (8, 9), (12, 13))
。在如果你不想的话,我们可以把我们的东西做成一套。我们需要为此使用
frozenset
,因为正规集是可变的,因此不易损坏,因此不能设置项。在输出
相关问题 更多 >
编程相关推荐