代码之家  ›  专栏  ›  技术社区  ›  corymathews

将列表拆分为较小的列表

  •  110
  • corymathews  · 技术社区  · 15 年前

    我正在寻找一种方法,可以轻松地将一个python列表分成两半。

    如果我有一个数组:

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

    我可以得到:

    B = [0,1,2]
    
    C = [3,4,5]
    
    15 回复  |  直到 6 年前
        1
  •  164
  •   maxymoo    6 年前
    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)
    
        2
  •  69
  •   ChristopheD    15 年前

    一个更通用的解决方案(您可以指定所需零件的数量,而不仅仅是“半分割”):

    编辑 :更新了日志以处理奇数列表长度

    编辑2 :根据Brians信息性评论再次更新帖子

    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)
    
        3
  •  37
  •   Rod    11 年前
    f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
    f(A)
    

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

        4
  •  26
  •   Lavande MindCorrupted    7 年前
    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]]
    
        5
  •  12
  •   John Montgomery    15 年前

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

        6
  •  12
  •   Chris Song    12 年前

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

    def split(arr, count):
         return [arr[i::count] for i in range(count)]
    
        7
  •  10
  •   AGS    9 年前

    如果你不在乎订单…

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

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

        8
  •  7
  •   Stefan Kendall    15 年前
    def splitter(A):
        B = A[0:len(A)//2]
        C = A[len(A)//2:]
    
     return (B,C)
    

    我测试过,在python 3中强制int除法需要双斜杠。我原来的帖子是正确的,尽管怀西威格出于某种原因闯入了歌剧院。

        9
  •  6
  •   Jonathan Berger    12 年前

    对于将一个数组拆分成更小的数组这一更为普遍的情况,有一个官方的python receipipe。 n .

    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)
    

    此代码段来自 python itertools doc page .

        10
  •  3
  •   dbr    15 年前

    使用 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

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

    ..然后交换值得到下半部分:

    >>> i[len(i)/2:]
    [3, 4, 5]
    
        11
  •  2
  •   user91259    15 年前

    虽然上面的答案或多或少是正确的,但如果数组的大小不能被2整除,则可能会遇到问题,因为 a / 2 在python 3.0和早期版本中,如果指定 from __future__ import division 在脚本的开头。在任何情况下,你最好用整数除法。 a // 2 ,以便获得代码的“转发”兼容性。

        12
  •  0
  •   PunjCoder    12 年前

    有@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)
    
        13
  •  0
  •   Ruslanas BalčiÅ«nas    10 年前

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

    # 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:]
    
        14
  •  0
  •   SuperGuy10    7 年前
    #for python 3
        A = [0,1,2,3,4,5]
        l = len(A)/2
        B = A[:int(l)]
        C = A[int(l):]       
    
        15
  •  0
  •   M.A. Heshmat Khah    6 年前

    如果你有一个大名单,最好用 迭代工具 并根据需要编写一个函数来生成每个部分:

    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