到目前为止,我有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
;而在这个例子中它只有一个,而在另一些例子中则会更多。
答案 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编写优化的例程。