【问题标题】:Satisfying a Condition Among List of Lists of Arbitrary Length满足任意长度列表列表中的一个条件
【发布时间】:2013-05-08 21:12:27
【问题描述】:

我有一个任意长度的数字列表列表。

例如:

a = [[3,17,19,4],[4,18,10,1],[11,15,13],[7,9,12,16]]

嵌套的级别被限制在这个深度。

我想找出所有列表的第一个元素来自第一个内部列表,其第二个元素来自第二个内部列表,依此类推,这样这个新列表的元素都在增加。

根据给定的示例,[4, 10, 11, 12] 就是这样一个列表。

我正在苦苦挣扎,我希望解决方案是通用的,与有多少内部列表无关。

如果我保证有四个内部列表,我可以天真地编码:

for w in a[0]:
    for x in a[1]:
        for y in a[2]:
            for z in a[3]:
                if w < x < y < z:
                    print [w,x,y,z]

但如果我添加第五个内部列表,或者删除上面的第四个内部列表,我就不走运了。

无论主列表中有多少个内部列表,如何生成所有单调递增的“子列表”?

【问题讨论】:

    标签: python list


    【解决方案1】:
    def combine(lists, peak=None):
      if not lists:
        yield []
      else:
        for i in lists[0]:
          if peak is None or i > peak:
            for tail in combine(lists[1:], i):
              yield [ i ] + tail
    
    for x in combine([[3,17,19,4],[4,18,10,1],[11,15,13],[7,9,12,16]]): print x
    
    [3, 4, 11, 12]
    [3, 4, 11, 16]
    [3, 4, 15, 16]
    [3, 4, 13, 16]
    [3, 10, 11, 12]
    [3, 10, 11, 16]
    [3, 10, 15, 16]
    [3, 10, 13, 16]
    [4, 10, 11, 12]
    [4, 10, 11, 16]
    [4, 10, 15, 16]
    [4, 10, 13, 16]
    

    【讨论】:

      【解决方案2】:

      如果性能不是问题,您可以使用itertools.product 并遍历所有可能性,例如

      from itertools import product
      
      def is_increasing(seq):
          return all(x < y for x,y in zip(seq[:-1], seq[1:]))
      

      之后

      >>> a = [[3,17,19,4],[4,18,10,1],[11,15,13],[7,9,12,16]]
      >>> [k for k in product(*a) if is_increasing(k)]
      [(3, 4, 11, 12), (3, 4, 11, 16), (3, 4, 15, 16), 
      (3, 4, 13, 16), (3, 10, 11, 12), (3, 10, 11, 16), 
      (3, 10, 15, 16), (3, 10, 13, 16), (4, 10, 11, 12), 
      (4, 10, 11, 16), (4, 10, 15, 16), (4, 10, 13, 16)]
      

      [关于性能的评论不是因为itertools.product 本身很慢,只是如果你这样做,你必须搜索所有可能性,即使你可以用更智能的算法更早地排除它。]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        相关资源
        最近更新 更多