python实现列表的排列和组合

求解列表中元素的排列和组合问题这个问题之前就遇到过几次没有太留意,最近在做题的时候遇上挺多的排列组合问题的,想来有必要温习一下了,今天花点时间写一下,之前都是手工写的,后来知道可以直接使用python的内置模块就可以完成这个工作了,今天就使用python的itertools模块来完成这个工作,一共解决四个问题:

1.生成排列,列表中元素不允许重复出现

2.生成排列,列表中元素可以重复出现

3.生成组合,不限元素个数,列表中元素不允许重复出现

4.生成组合,不限元素个数,列表中元素可以重复出现

from itertools import product
from itertools import combinations
from itertools import permutations

class Solution(object):

    def permute(self, nums):
        """
        生成排列
        列表中元素不允许重复出现
        排列数计算为:n!,其中n为num_list列表中元素个数
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        from itertools import permutations
        temp_list = list(permutations(nums))
        return temp_list
    def permute2(self,nums):
        """
        生成排列
        列表中元素可以重复出现
        排列总数计算为:(n*n*n...*n),一共n个n相乘
        """
        num = len(nums)
        res_list = list(product(nums, repeat=num))
        return res_list
    def combinate(self,nums):
        """
        生成组合,不限元素个数
        列表中元素不允许重复出现
        组合数计算为:2^n,其中n为num_list列表中元素个数
        """
        res_list = []
        for i in range(len(nums) + 1):
            res_list += list(combinations(nums, i))
        return res_list
    def combinate2(self,nums):
        """
        生成组合,不限元素个数
        列表中元素可以重复出现
        """
        res_list = []
        num_list1 = [str(i) for i in nums]
        for i in range(0, len(nums) + 1):
            # zip()压缩可迭代对象,*号解压可迭代对象;
            res_list += [''.join(x) for x in product(*[num_list1] * i)]
        return res_list
nums = [1,2,3]
solution = Solution()
print(solution.permute(nums))
print(solution.permute2(nums))
print(solution.combinate(nums))
print(solution.combinate2(nums))

结果如下所示:

[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3)]
[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
['', '1', '2', '3', '11', '12', '13', '21', '22', '23', '31', '32', '33', '111', '112', '113', '121', '122', '123', '131', '132', '133', '211', '212', '213', '221', '222', '223', '231', '232', '233', '311', '312', '313', '321', '322', '323', '331', '332', '333']

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值