2013-04-09 31 views
1

什麼是做到這一點的最好辦法每第n個值:Python列表:交換的(N + 1)個

>>> replace2([1, 2, 3, 4, 5, 6]) 
[2, 1, 4, 3, 6, 5] 
+0

您是否需要處理有奇數個元素的情況? – Triptych 2013-04-09 15:50:23

+0

這個問題應該是*用n + 1替換每個n值* – Surya 2013-04-09 15:50:50

+0

在這裏有一個非常好的討論多個列表元素:http://stackoverflow.com/questions/5389507/iterating-over-every-two-elements -in-a-list – rongenre 2013-04-09 15:54:44

回答

8
def replace2inplace(lst): 
    lst[1::2], lst[::2] = lst[::2], lst[1::2] 

本採用分片分配和切片步長交換每對在清單中,就地

>>> somelst = [1, 2, 3, 4, 5, 6] 
>>> replace2inplace(somelst) 
>>> somelst 
[2, 1, 4, 3, 6, 5] 

否則,你可以使用一些技巧itertools

from itertools import izip, chain 

def replace2copy(lst): 
    lst1, lst2 = tee(iter(lst), 2) 
    return list(chain.from_iterable(izip(lst[1::2], lst[::2]))) 

其給出:

>>> replace2([1, 2, 3, 4, 5, 6]) 
[2, 1, 4, 3, 6, 5] 

list()呼叫可選的;如果你只需要循環的結果產生足夠:

from itertools import izip, chain, islice, tee 

def replace2gen(lst): 
    lst1, lst2 = tee(iter(lst)) 
    return chain.from_iterable(izip(islice(lst1, 1, None, 2), islice(lst2, None, None, 2))) 

for i in replace2gen([1, 2, 3, 4, 5, 6]): 
    print i 

其中replace2gen()可以採取任意迭代器了。

+0

很不錯...... – Triptych 2013-04-09 15:49:10

0

外的地方版本:

def replace2(lst): 
    return [x for pair in zip(lst[1::2], lst[::2]) for x in pair] 
0

我的選擇:

x = range(1,7) 
res = [e for e in itertools.chain(*zip(x[1::2],x[0::2]))] 
0
>>> a = [1, 2, 3, 4, 5, 6] 
>>> sum([[x+1,x] for x in a if x&1 == True],[]) 
[2, 1, 4, 3, 6, 5] 

編輯:請求一些進一步的解釋:

代碼步驟,通過各元素在列表中a,如果元素是奇數(x&1 == True)它將該元素和下一個元素以相反的順序放入列表中([x+1,x])。

隨着出sum(...,[])功能,我們將不得不

[[2, 1], [4, 3], [6, 5]] 

sum(...,[])功能通過使用列表的索引,而不是更普遍地刪除內部括號給

[2, 1, 4, 3, 6, 5] 

這是可以做到其數值:

>>> a = [1, 2, 3, 4, 5, 6] 
>>> sum([[a[x],a[x-1]] for x in range(len(a)) if x&1 == True],[]) 
[2, 1, 4, 3, 6, 5] 

但是,如果長度不均勻,這將刪除列表的最後一個元素。

+1

你能解釋一下這個代碼嗎? – Korcholis 2013-04-09 16:28:38