我正在寻找一种轻松地将python列表分成两半的方法。
这样,如果我有一个数组:
A = [0,1,2,3,4,5]
我将能够得到:
B = [0,1,2]
C = [3,4,5]
我正在寻找一种轻松地将python列表分成两半的方法。
这样,如果我有一个数组:
A = [0,1,2,3,4,5]
我将能够得到:
B = [0,1,2]
C = [3,4,5]
Answers:
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 = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
一些通用的解决方案(您可以指定所需的零件数量,而不仅仅是“分成两半”):
编辑:更新后的帖子以处理奇数列表长度
EDIT2:基于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)
//
表示整数除法。不应该将它们排除在外,因为它们在完成这项工作中非常重要。
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))
。在list
和lengths
列表的长度相同。j是交替的:5、4、5、4、5,并且split函数作用于前两个交替,即它将i
list 的第一个分别除以5和4,但在下一次迭代时将其拆分为4,4, 1。:\请回复,如果你想我解释更多的(发布一个新的问题)
如果您不在乎订单...
def split(list):
return list[::2], list[1::2]
list[::2]
从第0个元素开始获取列表中的每个第二个元素。
list[1::2]
从第一个元素开始获取列表中的第二个元素。
list
并使其list(...)
内建阴影。我已经看到lst
并list_
经常使用它来避免这种情况。
对于将数组拆分为较小的较小数组的更普遍的情况,有一个官方的Python记录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页面。
使用列表切片。语法基本上是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 of
1 , instead of the invalid list index of
1.5`):
>>> i[:len(i)//2]
[0, 1, 2]
..并交换周围的值以获得下半部分:
>>> i[len(i)//2:]
[3, 4, 5]
3//2
使1
,然后你i[:1]
,让你[0]
和和i[1:]
这给[1, 2]
如果列表很大,最好使用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]
这与其他解决方案相似,但速度更快。
# 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:]
在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行)上尝试了此代码,并且在不到一秒的时间内完成了代码。
只是我的两分钱。
谢谢!