2016-09-27 34 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