组合切割的总和为4

时间:2015-07-23 15:45:12

标签: python python-2.7 itertools

到目前为止,我有mylist = list(itertools.product(*a))

这个问题是它产生了太多的元组。如果所有元组的总和都是>我希望它不会产生元组。 4.例如

[(0, 0, 0, 0),
 (0, 0, 0, 1),
 (0, 0, 0, 2),
 (0, 0, 1, 0),
 (0, 0, 1, 1),
 (0, 0, 1, 2),
 (0, 1, 0, 0),
 (0, 1, 0, 1),
 (0, 1, 0, 2),
 (0, 1, 1, 0),
 (0, 1, 1, 1),
 (0, 1, 1, 2),
 (1, 0, 0, 0),
 (1, 0, 0, 1),
 (1, 0, 0, 2),
 (1, 0, 1, 0),
 (1, 0, 1, 1),
 (1, 0, 1, 2),
 (1, 1, 0, 0),
 (1, 1, 0, 1),
 (1, 1, 0, 2),
 (1, 1, 1, 0),
 (1, 1, 1, 1),
 (1, 1, 1, 2)]

它不应该(1, 1, 1, 2),因为它总和为5;而在这个例子中它只有一个,而在另一些例子中则会更多。

1 个答案:

答案 0 :(得分:1)

如果你的数据集很大,你可能会在这里使用numpy。

numpy.indices提供an equivalent of itertools.product您也可以有效过滤,

import numpy as np

arr = np.indices((4, 4, 4, 4)).reshape(4,-1).T
mask = arr.sum(axis=1) < 5
res = arr[mask]
print(res)

#[[0 0 0 0]
# [0 0 0 1]
# [0 0 0 2]
# [0 0 0 3]
# [0 0 1 0]
#  ... 
# [3 0 0 1]
# [3 0 1 0]
# [3 1 0 0]]

对于小数据集,如评论中所述,itertools.ifilter非常快,

from itertools import product, ifilter
gen = product((0,1,2,3), repeat=4)
res = ifilter(lambda x: sum(x) < 4, gen)
res = list(res) # converting to list only at the end

在这种特殊情况下,两种方法都具有可比性。

如果您需要针对此特定情况提供更好的性能,您始终可以使用C或Cython编写优化的例程。