2012-01-02 142 views
1

在Python中,我有兩個列表,它們具有相同數量的元素(例如8和8)或者一個小於另一個(例如7和8; 3和4):在Python中切換兩個列表的第一個和最後一個元素

list1 = ['A', 'B', 'C', 'D'] 
list2 = ['E', 'F', 'G', 'H'] 

list3 = ['A', 'B', 'C'] 
list4 = ['D', 'E', 'F', 'G'] 

我試圖找出最佳的方式來建立一個算法,將第一列表的最後一個半開關與最後名單上半年,導致這個,當兩個列表都有偶數個元素時:

switched_list1 = ['A', 'B', 'E', 'F'] 
switched_list2 = ['C', 'D', 'G', 'H'] 

...這時候列表的一個具有奇數:

switched_list3 = ['A', 'D', 'E'] 
switched_list4 = ['B', 'C', 'F', 'G'] 

什麼是建立一個算法,可以切換列表元素這樣的最有效方法是什麼?

+1

@Marcin我想你想要http://philosophy.stackexchange.com/這個問題的答案;爲了這個問題的目的,它和/或爲什麼是有問題並不重要。 – urschrei 2012-01-02 19:44:22

+3

@urschrei作爲OP並沒有給出這種明顯的編碼方式,因爲OP已經有了良好的聲譽,我知道Marcin在想這個問題是否隱藏了某些東西。 – joaquin 2012-01-02 19:56:22

+0

對不起,我沒有讓問題更清楚。我可能應該把它標記爲Pythonic,並將其解釋得更好一些。問題在於我試圖找出更快,更有效的方法來切換位置,而不是使用臨時變量,如joaquin的答案。我做了類似的事情,但對於它所花費的代碼行數感到沮喪。因此,(不幸地)未知的問題...... :( – Andrew 2012-01-02 20:04:55

回答

2
>>> def StrangeSwitch(list1,list2): 
    return (list1[:len(list1)/2]+list2[:len(list2)/2],list1[len(list1)/2:]+list2[len(list2)/2:]) 

>>> list1 = ['A', 'B', 'C', 'D'] 
>>> list2 = ['E', 'F', 'G', 'H'] 
>>> (list1,list2)=StrangeSwitch(list1,list2) 
>>> list1 
['A', 'B', 'E', 'F'] 
>>> list2 
['C', 'D', 'G', 'H'] 
>>> list3 = ['A', 'B', 'C'] 
>>> list4 = ['D', 'E', 'F', 'G'] 
>>> (list3,list4)=StrangeSwitch(list3,list4) 
>>> list3 
['A', 'B', 'C'] 
>>> list4 
['B', 'C', 'F', 'G'] 
>>> 

讀通過OP的評論我想借此提出了另一種方法

>>> def StrangeSwitchFast(list1,list2): 
    #return (list1[:len(list1)/2]+list2[:len(list2)/2],list1[len(list1)/2:]+list2[len(list2)/2:]) 
    return (list(itertools.chain(itertools.islice(list1,0,len(list1)/2),itertools.islice(list2,0,len(list2)/2))), 
     list(itertools.chain(itertools.islice(list1,len(list1)/2,None),itertools.islice(list2,len(list2)/2,None)))) 

以上不會產生任何臨時列表,如果和特權OP希望將它用作迭代器而不是下游處理的列表,然後可以從列表中安全地刪除列表函數並且可以作爲迭代器的元組返回。

3
list1 = ['A', 'B', 'C'] 
list2 = ['D', 'E', 'F', 'G'] 

nlist1 = len(list1)/2 
nlist2 = len(list2)/2 

new1 = list1[:nlist1] + list2[:nlist2] 
new2 = list1[nlist1:] + list2[nlist2:] 

print new1 
print new2 

產生

['A', 'D', 'E'] 
['B', 'C', 'F', 'G'] 
相關問題