【问题标题】:Printing all subsets with only a given length in python在python中打印只有给定长度的所有子集
【发布时间】:2021-01-29 01:36:57
【问题描述】:

我的任务是打印给定长度的所有子集,我创建了打印所有子集的函数。一切正常,生成子集,但每次调用的输出都是错误的。例如,如果我调用 print(get_subsets([1,2,3],2)),则输出为 [1,2] [1,3] [2,3] 和 [3]。当然 3 不应该在那里,我不知道为什么。任何帮助都将受到赞赏和反馈。

def get_subsets(nums, k):
  all_subsets = []

  _gen_subsets(nums =nums,curr_idx =0,curr_subset=[],
               all_subsets=all_subsets)


  for curr_subset in all_subsets:
    if len(curr_subset) > k or len(curr_subset) < k:
      all_subsets.remove(curr_subset)


  return all_subsets


def _gen_subsets(nums,curr_idx, curr_subset, all_subsets):
  if curr_idx >= len(nums):
    all_subsets.append(curr_subset)
  else:
    itr_subset = curr_subset.copy()
    itr_subset.append(nums[curr_idx])

    _gen_subsets(nums=nums,
             curr_idx=curr_idx+1,
             curr_subset=itr_subset,
             all_subsets=all_subsets)

    _gen_subsets(nums=nums,
             curr_idx=curr_idx+1,
             curr_subset=curr_subset,
             all_subsets=all_subsets)

【问题讨论】:

  • 在您使用或操作时将f len(curr_subset) &gt; k or len(curr_subset) &lt; k:更改为if len(curr_subset)!=k,此条件仅在length ==k时失败,

标签: python recursion


【解决方案1】:

您正试图遍历一个列表,您也从中删除元素。这弄乱了子集列表的位置和索引,并给了你错误的输出。

将函数 get_subsets 改成这样:

def get_subsets(nums, k):
    all_subsets = []

    _gen_subsets(nums =nums,curr_idx =0,curr_subset=[],
           all_subsets=all_subsets)

    final_subset = all_subsets.copy()
    for n in all_subsets:
        if len(n) != k:
            final_subset.remove(n)

    return final_subset

或者这个:

def get_subsets(nums, k):
    all_subsets = []

    _gen_subsets(nums =nums,curr_idx =0,curr_subset=[],
           all_subsets=all_subsets)

    all_subsets = [n for n in all_subsets if len(n) == k]

    return all_subsets

【讨论】:

    【解决方案2】:

    你的问题是由这个引起的:

      for curr_subset in all_subsets:
        if len(curr_subset) > k or len(curr_subset) < k:
          all_subsets.remove(curr_subset)
    

    您在迭代时删除了数组元素。这会导致以下情况:最初您有数组[X1, X2, X3]。 在第一次迭代中,您删除了第一个元素 X1。然后第二个元素 X2 成为第一个元素,因此,在第二次迭代中,第三个元素 X3(已成为第二个元素)被遍历并跳过 X2。这就是为什么 [3] 不会从您的数组中删除的原因。

    为了解决这个问题,你可以改变get_subsets函数如下:

    def get_subsets(nums, k):
        all_subsets = []
    
        _gen_subsets(nums =nums,curr_idx =0,curr_subset=[],
               all_subsets=all_subsets)
    
        all_subsets = [subset for subset in all_subsets if len(subset) == k]
    
        return all_subsets
    

    【讨论】:

      【解决方案3】:

      也许这两个对你有帮助?

      def Combinations(l, d):
          if (d <= 1) or (len(l) <= 1):
              return [[i] for i in l]
          else:
              result = []
              for i in range(len(l)):
                  c = l[i]
                  lx = l[:i]+l[i+1:]
      
                  for cmb in Combinations(lx, d-1):
                      result.append([c]+cmb)
              return result
      print(*Combinations([1, 2, 3, 4, 5, 6], 2), sep='\n')
      
      
      def Allocations(l, d):
          if (d <= 1) or (len(l) <= 1):
              return [[i] for i in l]
          else:
              result = []
              for i in range(len(l)+1-d):
                  c = l[i]
                  lx = l[i+1:]
      
                  for cmb in Allocations(lx, d-1):
                      result.append([c]+cmb)
              return result
      print(*Allocations([1, 2, 3, 4, 5, 6], 3), sep='\n')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多