これを行う最善の方法は何ですか:
>>> replace2([1, 2, 3, 4, 5, 6])
[2, 1, 4, 3, 6, 5]
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()
でも任意のイテレータを取ることができます。
私の選択:
x = range(1,7)
res = [e for e in itertools.chain(*zip(x[1::2],x[0::2]))]
>>> 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]
ただし、リストの長さが偶数でない場合、リストの最後の要素が削除されます。
場違いバージョン:
def replace2(lst):
return [x for pair in zip(lst[1::2], lst[::2]) for x in pair]