赞
踩
问题定义:给定一个列表a=[1,2,3,4],请获取它的所有子集,即获取[[], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 4], [1, 3], [1, 3, 4], [1, 4], [2], [2, 3], [2, 3, 4], [2, 4], [3], [3, 4], [4]]
说明:给定一个长度为n的列表,那么它的子集数量就有2**n个
解题方法:
- #方法一:使用itertools库函数
- def get_subset(mylist):
- n =len(mylist)
- for num in range(n):
- for i in itertools.combinations(mylist,num+1):
- print(i)
- # get_subset(mylist=a)
- #方法二:二进制位运算
- def get_subset2(mylist):
- n = len(mylist)
- for i in range(2**n):
- combi = []
- for j in range(n):
- if (i>>j)%2:
- combi.append(mylist[j])
- print(combi)
- # get_subset2(mylist=a)
- #方法三:反向位运算
- def get_subset3(mylist):
- n = len(mylist)
- subset_nums = 1<<n
- for i in range(subset_nums):
- #&1的作用是判断当前是否能被2整除
- bits = [(i>>offset)%2 for offset in range(n-1,-1,-1)]
- # bits = [(i>>offset)&1 for offset in range(n-1,-1,-1)]
- current = [mylist[index] for (index,bit) in enumerate(bits) if bit==1]
- print(current)
- #get_subset3(mylist=a)
-
- def get_subset4(mylist):
- output = [[]]
- for num in mylist:
- output += [curr + [num] for curr in output]
- print(output)
- get_subset4(mylist=a)
-
- def get_subset5(mylist):
- def backtrack(first=0,curr=[]):
- #当curr的长度为k时
- if len(curr)==k:
- output.append(curr[:])
- #一般时候,把mylist[i]加入,然后判断mylist[i+1]
- for i in range(first,n):
- curr.append(mylist[i])
- backtrack(i+1,curr)
- curr.pop()
- output=[]
- n = len(mylist)
- for k in range(n+1):
- backtrack()
- print(output)
- get_subset5(mylist=a)
-
- def get_subset6(mylist):
- n = len(mylist)
- output=[]
- for i in range(2**n,2**(n+1)):
- bitmask = bin(i)[3:]
- curr = [mylist[i] for i in range(n) if bitmask[i]=='1']
- output.append(curr)
- print(output)
- get_subset6(mylist=a)
-
- def get_subset7(mylist):
- res = [[]]
- for i in mylist:
- res = res+ [[i] + num for num in res]
- print(res)
- get_subset7(mylist=a)
-
- #递归
- def get_subset8(mylist):
- res = []
- n = len(mylist)
-
- def helper(i,tmp):
- res.append(tmp)
- for j in range(i,n):
- helper(j+1,tmp+[mylist[j]])
- helper(0,[])
- print(res)
- get_subset8(mylist=a)

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。