【问题标题】:Python split a list into smaller lists depending on original list lengthPython 根据原始列表长度将列表拆分为更小的列表
【发布时间】:2013-11-26 10:44:37
【问题描述】:

我正在尝试提出一个函数来根据列表的原始长度平均分割列表的长度。

例如,如果我返回的数据集为 2000,我想将其拆分为 4。而如果数据集为 1500,则将其拆分为 3。

然后调用函数:

Thread_A_DATA, Thread_B_DATA = split_list( SQL_RETURN )

我想做如下的事情:

if len(dataset) <= 1000:
    # Split in 2
    a, b = split_list(dataset, 2)
if len(dataset) > 1000 or len(dataset) <= 1500:
    # Split in 3
    a, b, c = split_list(dataset, 3)

# etc etc...

我已经设法使用之前在 stackoverflow 上找到的代码将数据集分成两半:

def split_list( a_list ):
    half = len( a_list ) / 2
    return a_list[:half], a_list[half:] 

但我无法用 3,4 或 5 次拆分!

如果有人可以提供帮助,那就太好了。

提前致谢。

【问题讨论】:

    标签: python arrays list split dataset


    【解决方案1】:

    据我了解,您不想每 500 个元素拆分一次,而是如果少于 1000 个元素拆分为 2 个,如果少于 1500 个拆分为 3 个,2000 个拆分为 4 个,等等。但是如果有 1700 个元素,您将分成 4 组,每组 425 个元素(这就是我对“均分”的理解)。

    所以,这是我的解决方案:

    def split_list(a_list, number_of_splits):
        step = len(a_list) / number_of_splits + (1 if len(a_list) % number_of_splits else 0)
        return [a_list[i*step:(i+1)*step] for i in range(number_of_splits)]
    
    l = [1, 8, 2, 3, 4, 5, 6, 7, 1, 5, 3, 1, 2, 5]
    print l
    print split_list(l, 3)
    print split_list(l, 2)
    

    输出

    [1, 8, 2, 3, 4, 5, 6, 7, 1, 5, 3, 1, 2, 5]
    [[1, 8, 2, 3, 4], [5, 6, 7, 1, 5], [3, 1, 2, 5]]
    [[1, 8, 2, 3, 4, 5, 6], [7, 1, 5, 3, 1, 2, 5]]
    

    编辑:Python 3 版本:

    def split_list(a_list, number_of_splits):
        step = len(a_list) // number_of_splits + (1 if len(a_list) % number_of_splits else 0)
        return [a_list[i*step:(i+1)*step] for i in range(number_of_splits)]
    
    l = [1, 8, 2, 3, 4, 5, 6, 7, 1, 5, 3, 1, 2, 5]
    print(l)
    print(split_list(l, 3))
    print(split_list(l, 2))
    

    【讨论】:

      【解决方案2】:

      Python 3

      def splitList(L):
        return[L[i:i+500] for i in range(0, len(L), 500)]
      

      Python 2

      def splitList(L):
        return[L[i:i+500] for i in xrange(0, len(L), 500)]
      

      【讨论】:

      • 感谢您的意见
      【解决方案3】:
      def split_it(a_list,size_of_split):
          return zip(*[iter(a_list)]*size_of_split)
      

      很有趣

      print split_it(range(100),3)  # splits it into groups of 3
      

      不幸的是,如果列表没有平均分成 split_size,这将截断列表的末尾...您可以像这样修复它

      return zip(*[iter(a_list)]*size_of_split) + [tuple(a_list[-(len(a_list)%size_of_split):])]
      

      如果你想把它切成7块说你可以找到分割的大小

      split_size = len(a_list) / num_splits
      

      【讨论】:

      • 看起来您没有按预期添加最后 2 项:>>> l = [1, 8, 2, 3, 4, 5, 6, 7, 1, 5, 3 , 1, 2, 5] >>> split_it(l, 3) [(1, 8, 2), (3, 4, 5), (6, 7, 1), (5, 3, 1), 2 , 5]
      • [(1, 8, 2), (3, 4, 5), (6, 7, 1), (5, 3, 1), [2, 5]] 这更好,但混合元组和列表仍然很奇怪:)。
      • 但是现在,我又收到了[(1, 8, 2), (3, 4, 5), (6, 7, 1), (5, 3, 1), 2, 5]。但是,它适用于 return zip(*[iter(a_list)]*size_of_split) + [tuple(a_list[-(len(a_list)%size_of_split):])]
      • bah 再次正确...我想避免这种情况(显式元组转换),但无论如何:P
      • 我实际上花了一些时间来了解那里发生了什么:)。我喜欢您的解决方案,可惜对于这种特殊情况它变得如此复杂。
      【解决方案4】:

      Python 2.7

      >>> import math
      >>> lst = range(35)
      >>> t = 3 # how many items to be splited
      >>> n = int(math.ceil(len(lst) / float(t)))
      >>> res = [lst[i:i+n] for i in range(0, len(lst), n)]
      >>> res
      [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 2015-12-13
        • 1970-01-01
        • 2011-01-05
        • 2010-12-11
        • 1970-01-01
        相关资源
        最近更新 更多