【问题标题】:How to select all possible sub-list pairs from a given list whose union will be the list?如何从给定列表中选择所有可能的子列表对,其联合将成为列表?
【发布时间】:2019-06-08 01:41:37
【问题描述】:

给定一个列表说 [4,5,6,7] 我想写一个函数来输出 所有对,如 ([4,5,7],[6]) ,( [4,5] , [6,7]) 子列表长度不固定

我使用了一个 for 循环和两个新列表来将第 i 个元素附加到第一个列表中 并将剩余的附加到列表 2 然后重复这个过程,我知道这是一种愚蠢的方法

a = [4,5,6,7]
for x in range(0,len(a)):
     b = []
     c = []
     b.append(a[x])
     for y in range(0,len(a)):
          if y!=x:
               c.append(a[y])
     print(b,c)
for x in range(0,len(a)-1):
     b = []
     c = []
     b.append(a[x])
     b.append(a[x+1])
     for y in range(0,len(a)):
          if y!=x and y!=x+1:
               c.append(a[y])
     print(b,c)   

我希望打印所有可能的子列表,但总是错过不连续的子列表,我得到([4, 5],[6,7])但从不生成 ([4,6],[5,7])

【问题讨论】:

    标签: python list


    【解决方案1】:

    这是一个不删除重复项的解决方案:

    from itertools import combinations
    
    a = [4,4,5,6,7]
    result = []
    
    for x in range(len(a) + 1):
        for left in combinations(a, x):
            right = a.copy()
            for ele in left:
                right.remove(ele)
            result.append([list(left), right])
    
    for res in result:
        print(res)
    

    输出:

    [[], [4, 4, 5, 6, 7]]
    [[4], [4, 5, 6, 7]]
    [[4], [4, 5, 6, 7]]
    [[5], [4, 4, 6, 7]]
    [[6], [4, 4, 5, 7]]
    [[7], [4, 4, 5, 6]]
    [[4, 4], [5, 6, 7]]
    [[4, 5], [4, 6, 7]]
    [[4, 6], [4, 5, 7]]
    [[4, 7], [4, 5, 6]]
    [[4, 5], [4, 6, 7]]
    [[4, 6], [4, 5, 7]]
    [[4, 7], [4, 5, 6]]
    [[5, 6], [4, 4, 7]]
    [[5, 7], [4, 4, 6]]
    [[6, 7], [4, 4, 5]]
    [[4, 4, 5], [6, 7]]
    [[4, 4, 6], [5, 7]]
    [[4, 4, 7], [5, 6]]
    [[4, 5, 6], [4, 7]]
    [[4, 5, 7], [4, 6]]
    [[4, 6, 7], [4, 5]]
    [[4, 5, 6], [4, 7]]
    [[4, 5, 7], [4, 6]]
    [[4, 6, 7], [4, 5]]
    [[5, 6, 7], [4, 4]]
    [[4, 4, 5, 6], [7]]
    [[4, 4, 5, 7], [6]]
    [[4, 4, 6, 7], [5]]
    [[4, 5, 6, 7], [4]]
    [[4, 5, 6, 7], [4]]
    [[4, 4, 5, 6, 7], []]
    

    【讨论】:

      【解决方案2】:

      您可以使用itertools 模块来构造所有此类子列表:

      import itertools as it
      
      s = {4,5,6,7}
      for length in range(len(s)):
          for combination in it.combinations(s, length):
              print(list(combination), list(s - set(combination)))
      
      [] [4, 5, 6, 7]
      [4] [5, 6, 7]
      [5] [4, 6, 7]
      [6] [4, 5, 7]
      [7] [4, 5, 6]
      [4, 5] [6, 7]
      [4, 6] [5, 7]
      [4, 7] [5, 6]
      [5, 6] [4, 7]
      [5, 7] [4, 6]
      [6, 7] [4, 5]
      [4, 5, 6] [7]
      [4, 5, 7] [6]
      [4, 6, 7] [5]
      [5, 6, 7] [4]
      

      【讨论】:

      • 你漏掉了[4, 5, 6, 7] []。您可以通过将 range 更改为 range(len(s) + 1) 来获得它。
      • 这将拒绝重复我的意思是如果制作一组 {4,5,6,4} 则 4 会丢失,这就是我提到“列表”而不是“集合”的原因
      【解决方案3】:

      您可以创建一个随机子列表,然后获取第二个列表中不在随机子列表中的元素:

      def get_from_0_to_len_minus_1_elements_from_original_list():
          pass # You implement this
      
      
      list1 = get_from_0_to_len_minus_1_elements_from_original_list()
      list2 = [element for element in original_list if element not in list1]
      print(list1, list2)
      

      关于如何将原始列表分成随机块,由您自己解决

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多