1

これを行う最善の方法は何ですか:

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

4 に答える 4

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()でも任意のイテレータを取ることができます。

于 2013-04-09T15:48:20.823 に答える
0

私の選択:

x = range(1,7)
res = [e for e in itertools.chain(*zip(x[1::2],x[0::2]))]
于 2013-04-09T15:54:45.673 に答える
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]

ただし、リストの長さが偶数でない場合、リストの最後の要素が削除されます。

于 2013-04-09T16:08:43.327 に答える
0

場違いバージョン:

def replace2(lst):
    return [x for pair in zip(lst[1::2], lst[::2]) for x in pair]
于 2013-04-09T15:50:54.427 に答える