如何使用 Python 计算列表元素的所有可能组合

给定一个列表,如何计算该列表元素的所有可能组合?例如,给定列表 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]]
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值