2016-09-27 35 views
-2

我需要编写一个将任意列表分成两个相等部分的函数。如果列表的长度是偶数,我想把它分成两部分,如果列表的长度是奇数,我想忽略中心元素。将单独的列表分成两个相等的部分和切片

So [1,2,3,4,5,6] => [1,2,3] and [4,5,6] 
and [1,2,3,4,5] => [1,2] and [4,5] 

我试着做以下方式:既为偶数和奇数长度

list = [1,100,50,-51,1,1] 
s = len(list)/2 
left = list[s+1:] 
right = list[:s] 

但是,这种方法行不通。 有没有一种方法可以将切片用于此目的,或者没有办法,最好是使用循环/迭代?

+2

我想你左右颠倒了...... – GolfWolf

+1

's = len(x)/ 2'上的'x'是什么? – Kevin

+0

@Kevin这是旧的代码,对不起。这里x =列表。 – Paul

回答

2

的列表,右键片的长度使用divmod从商之和取和其余部分:

lst = [1,100,50,-51,1,1] 

s = divmod(len(lst), 2) 
left = lst[:s[0]] 
right = lst[sum(s):] 
+0

也许downvoter可以留下评论 –

+1

没有downvoted它,但loooks像这种方法不适合奇数列表:f( [1,100,50,-51,1]) - > [170]:([-51,1],[1,100,50]) – Paul

+0

@Paul如果它不起作用,我不会发布。你应该试试 –

4

这里试试这个

length = len(list) 
half = int(length/2) 
first_half = list[:half] 
second_half = list[length-half:] 

诀窍是切割小数脱了一半的时候很奇怪

+0

也可以!谢谢! – Paul

+1

我建议'长度// 2'而不是'int(长度/ 2)' – Guillaume

2

如何在右半边使用负向索引?

def separate(seq): 
    s = len(seq)/2 
    left = seq[:s] 
    right = seq[-s:] 
    return left, right 

print separate([1,2,3,4,5,6]) 
#result: ([1, 2, 3], [4, 5, 6]) 
print separate([1,2,3,4,5]) 
#result: ([1, 2], [4, 5]) 
+1

最佳答案恕我直言,只要注意具有不同行为的'/'操作符取决于python版本 – Guillaume

+0

好的观察结果。对于版本互兼容性,请考虑使用'//'运算符。 – Kevin

+0

@Guillaume:哎呀,它在Py2中有不同的行为,取决于'from __future__ import division'是否有效。我倾向于在所有Python代码中适当地使用'//',无论它是用于Py2还是Py3(它支持使用或不使用'__future__'导入)。 – ShadowRanger

0

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)

如果你不关心...的顺序

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

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

+0

但是当A是[1,2,3,4,5]时,C是[3,4,5]。OP希望它只是[4,5]。 – Kevin