【问题标题】:Extracting contiguous data from a list从列表中提取连续数据
【发布时间】:2013-11-22 23:34:27
【问题描述】:

我有一个清单:

l = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]

我想存储每个连续运行的块,这样:

Begin End Value
0     3   1
4     8   0

等等。

存储这些数据并能够以上述表格形式将其输出的最佳方式是什么?

【问题讨论】:

    标签: python list output


    【解决方案1】:

    你可以把它分解一下,但这确实是运行和长度:

    from itertools import groupby
    from operator import itemgetter
    
    data = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
    blocks = [map(itemgetter(0), itemgetter(0, -1)(list(g))) + [k] for k, g in groupby(enumerate(data), itemgetter(1))]
    # [[0, 3, 1], [4, 8, 0], [9, 11, 1], [12, 13, 0]]
    

    【讨论】:

      【解决方案2】:
      >>> L = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
      >>> from itertools import groupby
      >>> from operator import itemgetter
      >>> for key,it in groupby(enumerate(L), key=itemgetter(1)):
          first_index = next(it)[0]  # at least one value will always exist
          end_index = first_index + sum(1 for _ in it)
          print('{:3}{:3}{:3}'.format(first_index, end_index, key))
      
      
        0  3  1
        4  8  0
        9 11  1
       12 13  0
      

      【讨论】:

      • 这里为什么使用 enumerate 和 itemgetter?
      • @SpoonMeiser 我使用 enumerate 来委托它进行索引计算。这个索引被提取到第一个_index。 Itemgetter 只是让我仅按值对枚举元组进行分组,而无需索引。
      • @SpoonMeiser 另一个解决方案在整个运行过程中将临时/列表生成到内存中。我的解决方案没有这样做,但代码有点复杂。
      【解决方案3】:

      听起来你说的基本上是Run Length Encoding

      我可能会使用,至少作为中间表示,值和计数的二元组列表。

      我会展示一个实现,但 karthikr 使用 itertools.groupby 的答案比我要写的要好。

      根据该数据,您可以确定您描述的表格的开始和结束位置:

      begin = 0
      for value, length in rle_tuples:
          print begin, begin+length-1, value
          begin += length
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-02
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 2022-07-15
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多