当前位置:   article > 正文

python技巧——列出列表(集合)中的所有子集的方法总结_py 生成所有子集

py 生成所有子集

问题定义:给定一个列表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个

解题方法:

  1. #方法一:使用itertools库函数
  2. def get_subset(mylist):
  3. n =len(mylist)
  4. for num in range(n):
  5. for i in itertools.combinations(mylist,num+1):
  6. print(i)
  7. # get_subset(mylist=a)
  8. #方法二:二进制位运算
  9. def get_subset2(mylist):
  10. n = len(mylist)
  11. for i in range(2**n):
  12. combi = []
  13. for j in range(n):
  14. if (i>>j)%2:
  15. combi.append(mylist[j])
  16. print(combi)
  17. # get_subset2(mylist=a)
  18. #方法三:反向位运算
  19. def get_subset3(mylist):
  20. n = len(mylist)
  21. subset_nums = 1<<n
  22. for i in range(subset_nums):
  23. #&1的作用是判断当前是否能被2整除
  24. bits = [(i>>offset)%2 for offset in range(n-1,-1,-1)]
  25. # bits = [(i>>offset)&1 for offset in range(n-1,-1,-1)]
  26. current = [mylist[index] for (index,bit) in enumerate(bits) if bit==1]
  27. print(current)
  28. #get_subset3(mylist=a)
  29. def get_subset4(mylist):
  30. output = [[]]
  31. for num in mylist:
  32. output += [curr + [num] for curr in output]
  33. print(output)
  34. get_subset4(mylist=a)
  35. def get_subset5(mylist):
  36. def backtrack(first=0,curr=[]):
  37. #当curr的长度为k时
  38. if len(curr)==k:
  39. output.append(curr[:])
  40. #一般时候,把mylist[i]加入,然后判断mylist[i+1]
  41. for i in range(first,n):
  42. curr.append(mylist[i])
  43. backtrack(i+1,curr)
  44. curr.pop()
  45. output=[]
  46. n = len(mylist)
  47. for k in range(n+1):
  48. backtrack()
  49. print(output)
  50. get_subset5(mylist=a)
  51. def get_subset6(mylist):
  52. n = len(mylist)
  53. output=[]
  54. for i in range(2**n,2**(n+1)):
  55. bitmask = bin(i)[3:]
  56. curr = [mylist[i] for i in range(n) if bitmask[i]=='1']
  57. output.append(curr)
  58. print(output)
  59. get_subset6(mylist=a)
  60. def get_subset7(mylist):
  61. res = [[]]
  62. for i in mylist:
  63. res = res+ [[i] + num for num in res]
  64. print(res)
  65. get_subset7(mylist=a)
  66. #递归
  67. def get_subset8(mylist):
  68. res = []
  69. n = len(mylist)
  70. def helper(i,tmp):
  71. res.append(tmp)
  72. for j in range(i,n):
  73. helper(j+1,tmp+[mylist[j]])
  74. helper(0,[])
  75. print(res)
  76. get_subset8(mylist=a)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/369200
推荐阅读
相关标签
  

闽ICP备14008679号