Python:常见排列组合问题处理

排列组合问题主要有4类:

1、笛卡尔积:
itertools.product(*iterables[, repeat])

2、排列:
itertools.permutations(iterable[, r])

3、组合:
itertools.combinations(iterable, r)

4、组合(包含自身重复):
itertools.combinations_with_replacement(iterable, r)

笛卡尔积:若是单一列表笛卡尔乘积,则包含本身。例子中的AA,BB,CC

import itertools

for i in itertools.product('ABC', repeat=2):
    print(''.join(i), end=" ")
print('\n')  # 输出 AA AB AC BA BB BC CA CB CC

# 两个元组进行笛卡尔积:
a = (1, 2)
b = ('A', 'B', 'C')
c = itertools.product(a, b)
for i in c:
    print(i, end=",")  

# 输出(1, 'A') (1, 'B') (1, 'C') (2, 'A') (2, 'B') (2, 'C')

排列:

import itertools

for i in itertools.permutations('ABC', 2):
    print(''.join(i), end=" ")
# 输出 AB AC BA BC CA CB 
print('\n')

# 全排列:实际场景比较普遍。
# 例如:力扣题 - 没有重复元素集合的全排列:
# https://leetcode-cn.com/problems/VvJkup/

data = "ABC"
for i in itertools.permutations(data, len(data)):
    print(''.join(i), end=" ")
    
# ABC ACB BAC BCA CAB CBA
print('\n')

组合:

import itertools

for i in itertools.combinations('ABC', 1):
    print(''.join(i), end=" ")
# 输出 A B C
print('\n')


for i in itertools.combinations('ABC', 2):
    print(''.join(i), end=" ")
# 输出 AB AC BC
print('\n')


for i in itertools.combinations('ABC', 3):
    print(''.join(i), end=" ")
# 输出 ABC
print('\n')

组合(包含自身重复):

import itertools

for i in itertools.combinations_with_replacement('ABC', 1):
    print(''.join(i), end=' ')

# 输出 A B C 
print('\n')


for i in itertools.combinations_with_replacement('ABC', 2):
    print(''.join(i), end=' ')

# 输出 AA AB AC BB BC CC
print('\n')


for i in itertools.combinations_with_replacement('ABC', 3):
    print(''.join(i), end=' ')

# 输出 AAA AAB AAC ABB ABC ACC BBB BBC BCC CCC
print('\n')

# 子集:
nums = [1, 2, 3]
new_list = [[], nums]
for i in range(1, len(nums) + 1):
    for j in itertools.combinations(nums, i):
        new_list.append(list(j))

print(new_list)
# [[], [1, 2, 3], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

举例:

'BCDEF五个字母组合问题'
import itertools
 
print("1个组合:")
for i, val in enumerate(list(itertools.combinations('BCDEF', 1))):
    print("序号:%s   值:%s" % (i + 1, ''.join(val)))
print("2个组合:")
for i, val in enumerate(list(itertools.combinations('BCDEF', 2))):
    print("序号:%s   值:%s" % (i + 1, ''.join(val)))
print("3个组合:")
for i, val in enumerate(list(itertools.combinations('BCDEF', 3))):
    print("序号:%s   值:%s" % (i + 1, ''.join(val)))
print("4个组合:")
for i, val in enumerate(list(itertools.combinations('BCDEF', 4))):
    print("序号:%s   值:%s" % (i + 1, ''.join(val)))
print("5个组合:")
for i, val in enumerate(list(itertools.combinations('BCDEF', 5))):
    print("序号:%s   值:%s" % (i + 1, ''.join(val)))

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值