【问题标题】:Iterating over consecutive sublists in Python迭代Python中的连续子列表
【发布时间】:2011-02-01 04:01:51
【问题描述】:

Python 是否提供了一种方法来遍历给定列表 L 的所有“连续子列表” - 即 L 的子列表,其中任意两个连续元素在 L 中也是连续的 - 还是我应该自己编写?

(例如:如果 L = [1, 2, 3],那么我要迭代的集合是 {[1], [2], [3], [1, 2], [2,3 ], [1, 2, 3]}。[1, 3] 被跳过,因为 1 和 3 在 L 中不连续。)

【问题讨论】:

    标签: python iterator


    【解决方案1】:

    我不认为有一个内置的功能。但手动编码可能不会太难 - 你基本上只是循环从 1 到 L.length 的所有可能长度,然后获取每个长度的所有子字符串。

    您可能可以使用itertools.chain() 将每个子字符串长度的序列组合在一起,形成一个生成器。

    例子:

    >>> a = [1,2,3,4]
    >>> list(
    ... itertools.chain(
    ... *[[a[i:i+q] for q in xrange(1,len(a)-i+1)] for i in xrange(len(a))]
    ... )
    ... )
    [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
    

    如果您更喜欢按照您描述的长度递增然后按字典顺序排列的顺序,您会想要这样:

    itertools.chain(*[[a[q:i+q] for q in xrange(len(a)-i+1)] for i in xrange(1,len(a)+1)])
    

    【讨论】:

      【解决方案2】:

      试试这样的:

      def iter_sublists(l):
          n = len(l)+1
          for i in xrange(n):
              for j in xrange(i+1, n):
                  yield l[i:j]
      
      >>> print list(iter_sublists([1,2,3]))
      [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
      

      【讨论】:

        【解决方案3】:

        这应该可行:

        def sublists(lst):
            for sublen in xrange(1,len(lst)+1):
                for idx in xrange(0,len(lst)-sublen+1):
                    yield lst[idx:idx+sublen]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-11
          • 2018-11-03
          • 2016-11-04
          • 1970-01-01
          • 2014-02-13
          • 1970-01-01
          相关资源
          最近更新 更多