【问题标题】:Python or math: How to count all possible combinations of a list's elements?Python 或数学:如何计算列表元素的所有可能组合?
【发布时间】:2022-11-24 00:32:40
【问题描述】:

假设有一个列表[1,2,3,4,5],我需要获取元素(或“子列表”)所有可能组合的计数,例如1, 2, 3, 4, 5, 12, 13, 14, ..., 123, 124, ..., 12345。

我知道如何获取 nCr,即列表中 r 元素与总 n 元素的组合计数。
Python 3.8 或更高版本:

from math import comb
p, r = 5, 2
print(comb(p, r))

然后我可以做nC1 + nC2 +...+ nCn。但是有更好/更快的方法吗?

p, result = 5, 0
for r in range(1, 6):
    result += comb(p, r)
print(result)

非常感谢您的回答。

【问题讨论】:

标签: python math


【解决方案1】:

这个概念在数学上叫做power set,它指的是给定集合的所有子集。您的问题涉及功率集的大小,即 2^n,其中 n 是原始集的大小。这个总数包括空集,所以正如 C4stor 所说,你的总数是2^n - 1。

【讨论】:

  • 这个答案假设了独特的元素。如果有重复就是不正确的。
  • OP 没有提供任何规则,只是一个示例数据集,所以我选择半满杯:OP 应该给出更具体的说明 :=)
【解决方案2】:

这个特定的总和等于2^n -1 :-)

【讨论】:

  • 虽然这是真的,但需要一些上下文(可能以某种方式与二项式系数相关联)请参阅@jprebys answer
  • 这仅适用于独特的元素。如果有重复,那就更复杂了。
  • 正确的。谢谢。这个数字有术语吗? stats.stackexchange.com/questions/27266/…
【解决方案3】:

(这不是答案,但评论太长了哦,好吧。)

这里有一些细微差别你需要小心。如果您的列表是[1,1],您希望答案是什么?这甚至是一个可能的输入吗?

如果你知道你的元素是不同的,或者你想包括多种方式来生成相同的子列表,那么就像其他人所说的那样,2^n,如果你想排除空集则减去一个。

[1,1,2] 呢?你认为 [2,1] 与 [1,2] 不同吗?你甚至认为 [2,1] 是有效的,因为它需要从原始列表中重新排序元素?

您确实说过“组合”,这在数学上意味着顺序无关紧要,即[1,2] 与[2, 1] 相同。那是故意的吗?如果不是,这个词就是“排列”,它有不同的公式。

这些问题的答案会彻底改变你的结果。

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2023-03-17
    • 2012-10-18
    • 2023-04-10
    相关资源
    最近更新 更多