问题来源:《有意思的面试题-数独问题》 我在《多个数组,每个数组中选择一项,总共能有多少种组合,treelib实现》中写了通过treelib实现的方式,但我发现这个方式内存消耗量极大,有的时候内存使用量达到30G,reduce对内存的使用也很大,但性能上胜出,所以这次使用reduce搞一把。 废话不多说了,看代码:
import numpy as np import sys def combination(lists): if sys.version_info < (3, 0): import reduce else: from functools import reduce def reduceFun(list1, list2): array = [] for i in list1: for j in list2: array.append(np.hstack((i, j))) return array return reduce(reduceFun, lists) #lists = [[6, 8], [2, 5], [1, 9], [3, 9], [3, 5], [3, 9], [8, 9], [3, 6], [2, 9], [2, 3, 8], [2, 3, 6], [2, 5, 8], [1, 5, 8], [1, 6, 9], [5, 6, 9], [1, 3, 5], [3, 5, 6], [3, 8, 9]] lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] combin = combination(lists) print(len(combin)) print(combin)测试结果:
27 [array([1, 4, 7]), array([1, 4, 8]), array([1, 4, 9]), array([1, 5, 7]), array([1, 5, 8]), array([1, 5, 9]), array([1, 6, 7]), array([1, 6, 8]), array([1, 6, 9]), array([2, 4, 7]), array([2, 4, 8]), array([2, 4, 9]), array([2, 5, 7]), array([2, 5, 8]), array([2, 5, 9]), array([2, 6, 7]), array([2, 6, 8]), array([2, 6, 9]), array([3, 4, 7]), array([3, 4, 8]), array([3, 4, 9]), array([3, 5, 7]), array([3, 5, 8]), array([3, 5, 9]), array([3, 6, 7]), array([3, 6, 8]), array([3, 6, 9])]如果您感兴趣,就将上面的那串长的注释打开,效果也很不错呢。
