<h3>编辑:在澄清之后,我添加了一行应该完成解决方案…</h3>
<p>这个怎么样,它使用了几个<a href="https://docs.python.org/2/library/itertools.html#module-itertools" rel="nofollow noreferrer">itertools</a>和{a2}。无论如何,我想itertools.组合是您要使用的:</p>
<pre><code>from itertools import combinations, chain, product
def flatten(listOfLists):
"Flatten one level of nesting"
return chain.from_iterable(listOfLists)
lico = lambda li,x: list( combinations(li,x) )
def get_funky_groups( elements, k,n,l,m ):
kn = lico( lico(elements,n),k) # k groups of n elements
lm = lico( lico( elements,m), l) # l groups of m elements
results = [map( lambda x: "".join(x), flatten(r)) for r in product(kn, lm)]
# added this line so that only each element was used once..
return [ r for r in results if len(set( flatten( r))) == len(g) ]
</code></pre>
<p>对于您的示例列表,这将产生<strong>105</strong>结果</p>
^{pr2}$
<p>也许你不想要一个依赖于字符串元素的答案</p>
<pre><code>def get_funky_groups_anyhashable( elements, k,n,l,m ):
kn = lico( lico(elements,n),k) # k groups of n elements
lm = lico( lico( elements,m), l) # l groups of m elements
results = [ list(flatten(r)) for r in product(kn, lm)]
# added this line so that only each element was used once..
return [ r for r in results if len(set( flatten( r))) == len(g) ]
In [103]: g = ["A1", "B2", 232, "D0", 32]
In [104]: get_funky_groups_anyhashable(g, 1,2,1,3)
Out[104]:
[[('A1', 'B2'), (232, 'D0', 32)],
[('A1', 232), ('B2', 'D0', 32)],
[('A1', 'D0'), ('B2', 232, 32)],
[('A1', 32), ('B2', 232, 'D0')],
[('B2', 232), ('A1', 'D0', 32)],
[('B2', 'D0'), ('A1', 232, 32)],
[('B2', 32), ('A1', 232, 'D0')],
[(232, 'D0'), ('A1', 'B2', 32)],
[(232, 32), ('A1', 'B2', 'D0')],
[('D0', 32), ('A1', 'B2', 232)]]
</code></pre>
<p>同样值得注意的是,万一性能出现问题</p>
<pre><code>In [132]: lico( combinations( g,2),1) == lico( lico( g,2),1 )
Out[132]: True
</code></pre>