Python 中将列表拆分为更小的列表 (对半拆分)

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

如果我有一个数组

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

我就能得到:

B = [0,1,2]


C = [3,4,5]
489279 次浏览
def splitter(A):
B = A[0:len(A)//2]
C = A[len(A)//2:]


return (B,C)

我测试过,在python3中强制int除法需要双斜杠。我最初的帖子是正确的,尽管由于某种原因,wysiwyg在Opera中被打破了。

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)

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

使用列表分割。语法基本上是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]

一个更通用的解决方案(你可以指定你想要的部分数量,而不仅仅是“分成两半”):

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)

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

f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)

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

对于更通用的情况,将数组分割成大小为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)

此代码片段来自Python itertools文档页. xml文件。

如果你不关心订单……

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

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

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

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

有@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)
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]]

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

# 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:]
#for python 3
A = [0,1,2,3,4,5]
l = len(A)/2
B = A[:int(l)]
C = A[int(l):]

如果你有一个很大的列表,最好使用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

十年后…我想,为什么不加一条呢:

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

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行,它在几分之一秒内完成。

这只是我的个人意见。

谢谢!

通解将列表分成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
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)

因为没有限制我们可以使用哪种包装。Numpy有一个名为split的函数,你可以用它轻松地以任何你喜欢的方式分割array

例子

import numpy as np
A = np.array(list('abcdefg'))
np.split(A, 2)