Pythonリストの2つの項目の位置を切り替える方法は?


208

私はこの問題の適切な解決策をネット上で見つけることができませんでした(おそらく、switch、position、list、およびPythonがすべて、このような過負荷の単語であるためです)。

それはかなり単純です–私はこのリストを持っています:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']

私はの位置を切り替えるしたい'password2''password1'、彼らはすぐ隣、互いとのしていることだけが、その正確な位置を知ることではない- password2最初です。

私はかなり長いリストの添え字でこれを達成しましたが、もう少しエレガントなものを思いつくことは可能ですか?


あなたの問題は、リストで「password2」を見つけようとする効率ですか?「password1」を「password2」の前に置くことはできますか?元の質問では出会わない複雑さはありますか?それ以外の場合は、@ unwindに同意します。
ブレントがコード

3
あなたはあなたが持っているものを投稿するべきです-私はあなたが「かなり長いリストの添え字」によって何を意味するのか知りたいです。
samtregar、2010年

index1 = index( 'password1');の行に沿った何か。index2 = index( 'password2'); order = order [:index2] .append(order [index1])。append(order [index2])。append(order [index1 + 1:]); さらに数行に広げます。かしこまりました。
mikl

回答:


392
    i = ['title', 'email', 'password2', 'password1', 'first_name', 
         'last_name', 'next', 'newsletter']
    a, b = i.index('password2'), i.index('password1')
    i[b], i[a] = i[a], i[b]

165

単純なPythonスワップは次のようになります。

foo[i], foo[j] = foo[j], foo[i]

今、あなたがする必要があるのは何iが何であるかを理解することであり、それは簡単に次のようにして行うことができますindex

i = foo.index("password2")

15

あなたの仕様を考えると、私はスライス割り当てを使用します:

>>> L = ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
>>> i = L.index('password2')
>>> L[i:i+2] = L[i+1:i-1:-1]
>>> L
['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']

スライス割り当ての右側は「逆スライス」であり、次のように綴ることもできます。

L[i:i+2] = reversed(L[i:i+2])

多くの人がそうであるように、それがもっと読みやすいと思うなら。


タイトルとメール、最初の要素を2番目の要素に切り替える場合、なぜこれが機能しないのですか?
Luigi

申し訳ありませんが、i-1には要素がないため、空のリストが返されます
Luigi Tiburzi 2013年

7

どうすれば長くなることができますか

tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp

これは、一時ストレージを使用した単純なスワップです。


13
あなたが本当にそれについて「Pythonic」になりたいのなら、あなたもいつでもこれをすることができます:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
ブレント

0
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

この結果、最後の要素が位置の要素より大きい場合i、両方が交換されます。


-1

たとえば、次のように使用できます。

>>> test_list = ['title', 'email', 'password2', 'password1', 'first_name',
                 'last_name', 'next', 'newsletter']
>>> reorder_func = lambda x: x.insert(x.index('password2'),  x.pop(x.index('password2')+1))
>>> reorder_func(test_list)
>>> test_list
... ['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']

-1

私はpythonの専門家ではありませんが、試すことができます。

i = (1,2)

res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2)) 

上記の場合、o / pは次のようになります。

res(1, 2) = (2,1)

1
これは、交換するキーの位置がわからなければ機能しません。
mikl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.