【发布时间】:2018-07-14 03:17:04
【问题描述】:
我正在尝试解决从Python 的列表中获取唯一组合的一般问题
从https://www.mathsisfun.com/combinatorics/combinations-permutations-calculator.html 数学上,我可以看到组合数的公式是n!/r!(n-r)!,其中n 是序列的长度,r 是要选择的数字。
如下python所示,其中n为4,r为2:
lst = 'ABCD'
result = list(itertools.combinations(lst, len(lst)/2))
print len(result)
6
以下是显示我遇到的问题的辅助函数:
def C(lst):
l = list(itertools.combinations(sorted(lst), len(lst)/2))
s = set(l)
print 'actual', len(l), l
print 'unique', len(s), list(s)
如果我从 iPython 运行它,我可以这样称呼它:
In [41]: C('ABCD')
actual 6 [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
unique 6 [('B', 'C'), ('C', 'D'), ('A', 'D'), ('A', 'B'), ('A', 'C'), ('B', 'D')]
In [42]: C('ABAB')
actual 6 [('A', 'A'), ('A', 'B'), ('A', 'B'), ('A', 'B'), ('A', 'B'), ('B', 'B')]
unique 3 [('A', 'B'), ('A', 'A'), ('B', 'B')]
In [43]: C('ABBB')
actual 6 [('A', 'B'), ('A', 'B'), ('A', 'B'), ('B', 'B'), ('B', 'B'), ('B', 'B')]
unique 2 [('A', 'B'), ('B', 'B')]
In [44]: C('AAAA')
actual 6 [('A', 'A'), ('A', 'A'), ('A', 'A'), ('A', 'A'), ('A', 'A'), ('A', 'A')]
unique 1 [('A', 'A')]
我想要得到的是如上所示的唯一计数,但是执行 combinations 然后 set 无法扩展。
当lst(即n)的长度变长时,它会随着组合越来越大而变慢。
有没有办法使用数学或Python 技巧来解决计数唯一组合的问题?
【问题讨论】:
-
数一下就够了,还是你也想要实际的组合?
-
您似乎可以通过从原始列表中省略任何重复项然后从缩减列表中生成组合来找到唯一组合。例如。从 ABBC 获取 ABC 并从中生成组合。也许我在这里遗漏了一些东西。
-
@Robert 无法从您的精简列表中获取 (B,B)。
-
stackoverflow.com/questions/36429507/… .. 第 4 个回答下来.. 使用计数器
-
@johnashu 看着那个反例可能会做我想做的事:O - 尽管我不得不对其进行一些修复以使其正常工作,因为它在发布时失败了。