给定一个列表,如何计算该列表元素的所有可能组合?例如,给定列表 l = [1, 4, 6, 8, 11, 13]
,我们需要计算出如下的组合:
combL = [ [1],[4],[6],[8],[11],[13],[1,4], .. ]
2. 解决方案
2.1 使用 itertools 库
Python 的 itertools 库提供了很多有用的函数来处理迭代对象。我们可以使用该库中的 combinations()
函数来计算列表元素的所有可能组合。
from itertools import combinations
def get_all_combinations(input_list):
for i in xrange(len(input_list)):
for item in combinations(input_list, r = i + 1):
yield list(item)
2.1.1 函数说明
input_list
为输入列表。xrange(len(input_list))
表示生成一个范围为[0, len(input_list) - 1]
的整数序列。combinations(input_list, r = i + 1)
表示从input_list
中选取i + 1
个元素的所有可能组合。yield list(item)
表示使用list()
函数将item
转换为列表,然后通过yield
关键字将该列表作为生成器函数的返回值。
2.1.2 代码示例
input_list = [1,4,6,8,11,13]
for item in get_all_combinations(input_list):
print item
输出:
[1]
[4]
[6]
[8]
[11]
[13]
[1, 4]
[1, 6]
[1, 8]
[1, 11]
[1, 13]
[4, 6]
[4, 8]
[4, 11]
[4, 13]
[6, 8]
[6, 11]
[6, 13]
[8, 11]
[8, 13]
[11, 13]
[1, 4, 6]
[1, 4, 8]
[1, 4, 11]
[1, 4, 13]
[1, 6, 8]
[1, 6, 11]
[1, 6, 13]
[1, 8, 11]
[1, 8, 13]
[1, 11, 13]
[4, 6, 8]
[4, 6, 11]
[4, 6, 13]
[4, 8, 11]
[4, 8, 13]
[4, 11, 13]
[6, 8, 11]
[6, 8, 13]
[6, 11, 13]
[8, 11, 13]
[1, 4, 6, 8]
[1, 4, 6, 11]
[1, 4, 6, 13]
[1, 4, 8, 11]
[1, 4, 8, 13]
[1, 4, 11, 13]
[1, 6, 8, 11]
[1, 6, 8, 13]
[1, 6, 11, 13]
[1, 8, 11, 13]
[4, 6, 8, 11]
[4, 6, 8, 13]
[4, 6, 11, 13]
[4, 8, 11, 13]
[6, 8, 11, 13]
[1, 4, 6, 8, 11]
[1, 4, 6, 8, 13]
[1, 4, 6, 11, 13]
[1, 4, 8, 11, 13]
[1, 6, 8, 11, 13]
[4, 6, 8, 11, 13]
2.2 使用列表推导式
除了使用 itertools 库之外,我们还可以使用列表推导式来计算列表元素的所有可能组合。
[i for j in xrange(len(l)) for i in itertools.combinations(l, j+1)]
2.2.1 代码解释
xrange(len(l))
表示生成一个范围为[0, len(l) - 1]
的整数序列。itertools.combinations(l, j+1)
表示从l
中选取j + 1
个元素的所有可能组合。[i for j in xrange(len(l)) for i in itertools.combinations(l, j+1)]
表示使用列表推导式将所有组合转换为列表。
2.2.2 代码示例
l = [1,4,6,8,11,13]
print [i for j in xrange(len(l)) for i in itertools.combinations(l, j+1)]
输出:
[[1], [4], [6], [8], [11], [13], [1, 4], [1, 6], [1, 8], [1, 11], [1, 13], [4, 6], [4, 8], [4, 11], [4, 13], [6, 8], [6, 11], [6, 13], [8, 11], [8, 13], [11, 13], [1, 4, 6], [1, 4, 8], [1, 4, 11], [1, 4, 13], [1, 6, 8], [1, 6, 11], [1, 6, 13], [1, 8, 11], [1, 8, 13], [1, 11, 13], [4, 6, 8], [4, 6, 11], [4, 6, 13], [4, 8, 11], [4, 8, 13], [4, 11, 13], [6, 8, 11], [6, 8, 13], [6, 11, 13], [8, 11, 13], [1, 4, 6, 8], [1, 4, 6, 11], [1, 4, 6, 13], [1, 4, 8, 11], [1, 4, 8, 13], [1, 4, 11, 13], [1, 6, 8, 11], [1, 6, 8, 13], [1, 6, 11, 13], [1, 8, 11, 13], [4, 6, 8, 11], [4, 6, 8, 13], [4, 6, 11, 13], [4, 8, 11, 13], [6, 8, 11, 13], [1, 4, 6, 8, 11], [1, 4, 6, 8, 13], [1, 4, 6, 11, 13], [1, 4, 8, 11, 13], [1, 6, 8, 11, 13], [4, 6, 8, 11, 13]]