我写一个函数,应该输出的所有列表A. 此问题的K-方式划分显然是递归的,并且实施应该是直接的:一个列表的所有k路分区递归算法
def gen_partition_k_group(A, k):
#
if len(A) == 0 :
# EDITED FOLLOWING SUGGESTION
yield [ [] for _ in xrange(k) ]
#
else :
# all k-partitions of the list of size N-1
for ss in gen_partition_k_group(A[:-1], k) :
assert(sum(len(gg) for gg in ss) == len(A) -1)
for ii in xrange(k) :
tt = list(ss)
print tt
tt[ ii ].append(A[ -1 ])
print tt
assert(sum(len(gg) for gg in tt) == len(A))
yield tt
A = range(3)
k = 2
[ xx for xx in gen_partition_k_group(A, k) ]
输出
AssertionError:
[[], []]
[[0], [0]]
我不明白的输出。它应该是[[0], []]
而不是[[0], [0]]
。我错过了什么?
注:我知道如何编写一个不同的功能,而不需要append
,它输出正确的结果。 Iterator over all partitions into k groups?(第一回答)
我不明白的是这个特定函数的行为。
你知道'[[]] * k'为非零'k'会创建该相同列表的'k'个副本,对吗? – kojiro