Python itertools.combinations 的结果

11 投票
1 回答
23918 浏览
提问于 2025-04-17 09:01

我不明白从这个函数得到的结果数量为什么和标题里说的不一样,所以希望你们能帮帮我。

根据文档,http://docs.python.org/library/itertools.html#itertools.combinations,结果的数量应该是:

返回的项目数量是 n! / r! / (n-r)!,当 0 <= r <= n 时有效,或者当 r > n 时结果为零。

这个公式在文档中的例子是有效的:

combinations('ABCD', 2) --> AB AC AD BC BD CD

因为 n! / r! / (n-r)! = 4! / 2! / 2! = 6

但是如果我尝试:

combinations('ABCDEF', 3) --> AB AC AD AE AF BC BD BE BF CD CE CF DE DF EF

我得到的结果是15个。

但根据公式 n! / r! / (n-r)! = 6! / 3! / (6-3)! = 720 / 6 / 6 = 20

所以:Python文档告诉我应该有20个结果,但我只得到了15个。

你能帮我理解我哪里出错了吗?也许是我的数学有问题,因为这个公式在维基百科的组合条目里也是对的。

谢谢,

P.

1 个回答

22

itertools.combinations应该返回一个包含20个项目的迭代器:

In [40]: len(list(itertools.combinations('ABCDEF',3)))
Out[40]: 20

请注意

In [41]: len(list(itertools.combinations('ABCDEF',2)))
Out[41]: 15

而你发布的输出

combinations('ABCDEF', 3) --> AB AC AD AE AF BC BD BE BF CD CE CF DE DF EF

只显示了2个字母的组合。所以看起来你计算的是 combinations('ABCDEF', 2),而不是 combinations('ABCDEF', 3)

撰写回答