【问题标题】:Split list into smaller lists (split in half)将列表拆分为较小的列表(分成两半)
【发布时间】:2026-02-06 17:40:01
【问题描述】:

我正在寻找一种轻松将 python 列表一分为二的方法。

所以如果我有一个数组:

A = [0,1,2,3,4,5]

我可以得到:

B = [0,1,2]

C = [3,4,5]

【问题讨论】:

    标签: python list split


    【解决方案1】:
    A = [1,2,3,4,5,6]
    B = A[:len(A)//2]
    C = A[len(A)//2:]
    

    如果你想要一个函数:

    def split_list(a_list):
        half = len(a_list)//2
        return a_list[:half], a_list[half:]
    
    A = [1,2,3,4,5,6]
    B, C = split_list(A)
    

    【讨论】:

    • 您需要在 Python 3 中强制进行 int 除法。 // 是必需的。
    • 很好的解决方案,谢谢。它也适用于像 Python3 中的 80/20 这样的分数 B = A[:(len(A) // 10) * 8] C = A[(len(A) // 10) * 8:]
    【解决方案2】:

    更通用的解决方案(您可以指定所需的部分数量,而不仅仅是“分成两半”):

    def split_list(alist, wanted_parts=1):
        length = len(alist)
        return [ alist[i*length // wanted_parts: (i+1)*length // wanted_parts] 
                 for i in range(wanted_parts) ]
    
    A = [0,1,2,3,4,5,6,7,8,9]
    
    print split_list(A, wanted_parts=1)
    print split_list(A, wanted_parts=2)
    print split_list(A, wanted_parts=8)
    

    【讨论】:

    • 当列表不均分时(例如 split_list([1,2,3], 2) ),这实际上会返回 Wanted_pa​​rts+1 个列表。
    • 我认为更好的方法是:length = len(alist); return [ alist[i*length // Wanted_pa​​rts: (i+1)*length // Wanted_pa​​rts] for i in range(wanted_pa​​rts) ]。这样你就可以得到一个尽可能均匀的分布,并且总是得到准确的wanted_pa​​rts 项目(如果wanted_pa​​rts > len(A) 甚至用[] 填充)
    • 嗨..符号“//”是什么意思??
    • @Fraz 它的意思是内联注释。忽略“// Wanted_pa​​rts”和“// Wanted_pa​​rts”,让脚本执行。
    • // 表示整数除法。它们不应该被排除在外,因为它们对于完成这项工作非常重要。
    【解决方案3】:
    f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
    f(A)
    

    n - 结果数组的预定义长度

    【讨论】:

    • 这在我的情况下效果很好,但是它将每个列表的每个其他最后一个索引附加到它自己的列表中。难以解释。如果你能帮忙,请回复,我会解释更多。
    【解决方案4】:
    def split(arr, size):
         arrs = []
         while len(arr) > size:
             pice = arr[:size]
             arrs.append(pice)
             arr   = arr[size:]
         arrs.append(arr)
         return arrs
    

    测试:

    x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
    print(split(x, 5))
    

    结果:

    [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]
    

    【讨论】:

    • 对于将列表转换为矩阵也很有用
    • 这可行,但不完全。我在一个循环中使用这个函数,长度各不相同。换句话说:for i,j in zip(list,lengths): print(split(i,j))listlengths 列表具有相同的长度。 j 是交替的:5,4,5,4,5,并且 split 函数适用于前两个交替,即它将列表的第一个 i 拆分为 5 和 4,但在下一次迭代中它将它拆分为 4 ,4,1。 :\ 如果您希望我解释更多,请回复(发布一个新问题)
    【解决方案5】:

    如果你不关心订单...

    def split(list):  
        return list[::2], list[1::2]
    

    list[::2] 从第 0 个元素开始获取列表中的每个第二个元素。
    list[1::2] 从第一个元素开始获取列表中的每个第二个元素。

    【讨论】:

    • 谨慎命名 arg list 并隐藏 list(...) 内置。我见过lstlist_ 通常用来避免它。
    • 这感觉最pythonic(忽略不正确的命名)
    【解决方案6】:

    使用list slicing。语法基本是my_list[start_index:end_index]

    >>> i = [0,1,2,3,4,5]
    >>> i[:3] # same as i[0:3] - grabs from first to third index (0->2)
    [0, 1, 2]
    >>> i[3:] # same as i[3:len(i)] - grabs from fourth index to end
    [3, 4, 5]
    

    要获得列表的前半部分,从第一个索引切分到 len(i)//2(其中 // 是整数除法 - 所以 3//2 will give the floored result of1, instead of the invalid list index of1.5`):

    >>> i[:len(i)//2]
    [0, 1, 2]
    

    ..并交换周围的值以获得下半部分:

    >>> i[len(i)//2:]
    [3, 4, 5]
    

    【讨论】:

    • 奇数镜头列表怎么样)
    • @N997 代码应该仍然可以工作;您最终会在每个列表中得到不同数量的项目。所以说列表是三个项目长,除法运算符将结果放在结果中,所以3//2 给出1,然后你得到i[:1],它给你[0]i[1:],它给出[1, 2]
    【解决方案7】:

    B,C=A[:len(A)/2],A[len(A)/2:]

    【讨论】:

    • 我想你忘记了除以 2 步。 :)
    • 小心,使用整数除法// 代替其他人已经说过的。
    【解决方案8】:

    这是一个常见的解决方案,将 arr 拆分为 count 部分

    def split(arr, count):
         return [arr[i::count] for i in range(count)]
    

    【讨论】:

    • 这失去了列表的顺序
    【解决方案9】:
    def splitter(A):
        B = A[0:len(A)//2]
        C = A[len(A)//2:]
    
     return (B,C)
    

    我测试过,在 python 3 中强制 int 除法需要双斜杠。我原来的帖子是正确的,尽管出于某种原因,在 Opera 中所见即所得。

    【讨论】:

    • 它不能处理奇数 len(A) - 你有解决方案吗?
    【解决方案10】:

    如果你有一个很大的列表,最好使用 itertools 并编写一个函数来根据需要生成每个部分:

    from itertools import islice
    
    def make_chunks(data, SIZE):
        it = iter(data)
        # use `xragne` if you are in python 2.7:
        for i in range(0, len(data), SIZE):
            yield [k for k in islice(it, SIZE)]
    

    你可以这样使用:

    A = [0, 1, 2, 3, 4, 5, 6]
    
    size = len(A) // 2
    
    for sample in make_chunks(A, size):
        print(sample)
    

    输出是:

    [0, 1, 2]
    [3, 4, 5]
    [6]
    

    感谢@thefourtheye@Bede Constantinides

    【讨论】:

      【解决方案11】:

      对于将数组拆分为大小为n 的更小数组的更通用情况,有一个官方 Python 收据。

      from itertools import izip_longest
      def grouper(n, iterable, fillvalue=None):
          "Collect data into fixed-length chunks or blocks"
          # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
          args = [iter(iterable)] * n
          return izip_longest(fillvalue=fillvalue, *args)
      

      此代码 sn-p 来自python itertools doc page

      【讨论】:

        【解决方案12】:

        这与其他解决方案类似,但速度更快。

        # Usage: split_half([1,2,3,4,5]) Result: ([1, 2], [3, 4, 5])
        
        def split_half(a):
            half = len(a) >> 1
            return a[:half], a[half:]
        

        【讨论】:

        • 巧妙使用二进制移位!
        【解决方案13】:

        10 年后.. 我想 - 为什么不添加另一个:

        arr = 'Some random string' * 10; n = 4
        print([arr[e:e+n] for e in range(0,len(arr),n)])
        

        【讨论】:

          【解决方案14】:

          虽然上面的答案或多或少是正确的,但如果你的数组的大小不能被 2 整除,你可能会遇到麻烦,因为 a / 2 的结果很奇怪,在 python 3.0 中是一个浮点数,在早期版本中,如果您在脚本开头指定 from __future__ import division。无论如何,为了获得代码的“前向”兼容性,您最好使用整数除法,即a // 2

          【讨论】:

            【解决方案15】:
            #for python 3
                A = [0,1,2,3,4,5]
                l = len(A)/2
                B = A[:int(l)]
                C = A[int(l):]       
            

            【讨论】:

              【解决方案16】:

              来自@ChristopheD 的提示

              def line_split(N, K=1):
                  length = len(N)
                  return [N[i*length/K:(i+1)*length/K] for i in range(K)]
              
              A = [0,1,2,3,4,5,6,7,8,9]
              print line_split(A,1)
              print line_split(A,2)
              

              【讨论】:

                【解决方案17】:

                2020 年对这个问题的另一种看法......这是对这个问题的概括。我将“将列表分成两半”解释为..(即只有两个列表,并且在出现奇数的情况下不会溢出到第三个数组等)。例如,如果数组长度为 19,使用 // 运算符除以 2 得到 9,我们最终将得到两个长度为 9 的数组和一个长度为 1 的数组(第三个)(所以总共三个数组)。如果我们想要一个始终给出两个数组的通用解决方案,我会假设我们对长度不相等的结果双数组感到满意(一个会比另一个长)。并且假设可以混合顺序(在这种情况下交替)。

                """
                arrayinput --> is an array of length N that you wish to split 2 times
                """
                ctr = 1 # lets initialize a counter
                
                holder_1 = []
                holder_2 = []
                
                for i in range(len(arrayinput)): 
                
                    if ctr == 1 :
                        holder_1.append(arrayinput[i])
                    elif ctr == 2: 
                        holder_2.append(arrayinput[i])
                
                    ctr += 1 
                
                    if ctr > 2 : # if it exceeds 2 then we reset 
                        ctr = 1 
                

                此概念适用于您想要的任意数量的列表分区(您必须根据所需的列表部分调整代码)。并且解释起来相当简单。为了加快速度,您甚至可以在 cython / C / C++ 中编写这个循环来加快速度。再说一次,我在相对较小的列表上尝试了这段代码 ~ 10,000 行,它在几分之一秒内完成。

                只有我的两分钱。

                谢谢!

                【讨论】:

                  【解决方案18】:

                  通用解决方案拆分列表为n部分并进行参数验证:

                  def sp(l,n):
                      # split list l into n parts 
                      if l: 
                          p = len(l) if n < 1 else len(l) // n   # no split
                          p = p if p > 0 else 1                  # split down to elements
                          for i in range(0, len(l), p):
                              yield l[i:i+p]
                      else:
                          yield [] # empty list split returns empty list
                  

                  【讨论】:

                    【解决方案19】:
                    from itertools import islice 
                    
                    Input = [2, 5, 3, 4, 8, 9, 1] 
                    small_list_length = [1, 2, 3, 1] 
                    
                    Input1 = iter(Input) 
                    
                    Result = [list(islice(Input1, elem)) for elem in small_list_length] 
                    
                    print("Input list :", Input) 
                    
                    print("Split length list: ", small_list_length) 
                    
                    print("List after splitting", Result)
                    

                    【讨论】:

                    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center