【问题标题】:Splitting a list of arbitrary size into N-not-equal parts [duplicate]将任意大小的列表拆分为N个不相等的部分[重复]
【发布时间】:2014-06-10 07:41:41
【问题描述】:

我看到splitting-a-list-of-arbitrary-size-into-only-roughly-n-equal-parts。不等分怎么办?我的列表包含具有某些属性的项目(可以检索到对每个项目运行相同功能的值),如何将具有相同属性的项目拆分为新列表,例如新的子列表?与 lambda 相关的东西可以在这里工作吗?

简单的例子可以是:

list = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]

经过花哨的操作,我们可以:

list = [[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]

【问题讨论】:

  • "具有某些属性的项目" 这些属性是什么?
  • @LutzHorn 我为每个可以通过函数检索的对象都有数字属性。它对属于某个特定组的对象进行分类。每个对象只属于并且只属于一个组。可以有与列表中的项目一样多的组。

标签: python list split


【解决方案1】:
>>> L = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]
>>> [list(g) for i, g in itertools.groupby(L)]
[[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]
>>> L2 = ['apple', 'aardvark', 'banana', 'coconut', 'crow']
>>> [list(g) for i, g in itertools.groupby(L2, operator.itemgetter(0))]
[['apple', 'aardvark'], ['banana'], ['coconut', 'crow']]

【讨论】:

    【解决方案2】:

    您应该使用标准库中的itertools.groupby 函数。

    这个函数将它接收到的迭代中的元素分组(默认情况下使用恒等函数,即检查后继元素是否相等),并且对于分组元素的每个条纹,它会返回一个由条纹代表组成的 2 元组 (元素本身),以及条纹中元素的迭代器。

    确实:

    l = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]
    
    list(list(k[1]) for k in groupby(l))
    >>> [[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]
    

    附:您应该避免使用list 作为变量名,因为它会与内置类型/函数冲突。

    【讨论】:

      【解决方案3】:

      这是一个非常简单的滚动您自己的解决方案。如果所讨论的“属性”只是项目的价值,还有更直接的方法。

      def split_into_sublists(data_list, sizes_list):
          if sum(sizes_list) != len(data_list):
              raise ValueError
      
          count = 0
          output = []
          for size in sizes_list:
              output.append(data_list[count:count+size])
              count += size
          return output
      
      
      if __name__ == '__main__':
          data_list = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]
          sizes_list = [3,1,4,2]
          list2 = [[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]
          print(split_into_sublists(data_list, sizes_list) == list2) # True
      

      【讨论】:

        猜你喜欢
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2012-07-12
        • 2023-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多