Python listesindeki iki öğenin konumu nasıl değiştirilir?


208

Bu sorun için iyi bir çözüm bulamadım (muhtemelen anahtar, konum, liste ve Python gibi aşırı yüklenmiş kelimeler).

Oldukça basit - Bu listeye sahibim:

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

Konumlarını değiştirmek istiyorum 'password2've 'password1'- tam konumlarını bilmeden, sadece yan yana olduklarını ve password2ilk olduklarını .

Bunu oldukça uzun soluklu bir liste aboneliği ile başardım, ama biraz daha zarif bir şey bulmanın mümkün olduğunu merak ettim.


Sorununuz listede 'şifre2'yi bulmaya çalışmanın etkinliği mi? 'Password1', 'password2'den önce gelebilir mi? Burada orijinal sorunuzda rastlanmayan bir karmaşıklık var mı? Aksi takdirde @unwind ile hemfikirim.
Brent

3
Sahip olduklarınızı yayınlamalısınız - "Oldukça uzun soluklu bir liste aboneliği" ile ne demek istediğinizi merak ediyorum.
samtregar

İndex1 = index satırları boyunca bir şeyler ('password1'); index2 = dizin ('parola2'); order = order [: index2] .append (sipariş [index1]). append (order [index2]). append (sipariş [index1 + 1:]); birkaç satıra daha yayıldı. Güzel, hayır.
mikl

Yanıtlar:


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

Basit Python takası şöyle görünür:

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

Şimdi yapmanız gereken tek şey ne iolduğunu anlamak ve bu kolayca yapılabilir index:

i = foo.index("password2")

15

Spesifikasyonlarınız göz önüne alındığında, dilim atamasını kullanırdım:

>>> 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']

Dilim atamasının sağ tarafı "ters çevrilmiş bir dilim" dir ve ayrıca hecelenebilir:

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

Eğer bunu daha okunabilir bulursanız, birçok kişi gibi.


İkincisi olan ilk öğe olan başlığı ve postayı değiştirmek istiyorsanız neden bu çalışmıyor?
Luigi Tiburzi

Üzgünüm, şimdi anlıyorum, i-1'de hiçbir öğe yok, bu yüzden boş bir liste geri döndü
Luigi Tiburzi

7

Nasıl daha uzun olabilir

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

Bu sadece geçici depolama kullanan basit bir takas.


13
Bu konuda gerçekten "Pythonic" olmak istiyorsanız, bunu her zaman da yapabilirsiniz:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
Brent

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

bunun sonucunda eğer son eleman konumdaki elemandan büyükse, iikisi de değiştirilir.


-1

örneğin şunları kullanabilirsiniz:

>>> 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

Ben piton uzmanı değilim ama deneyebilirsiniz

i = (1,2)

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

yukarıdaki o / p'yi şu şekilde verir:

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

1
Değiştirilecek tuşların konumunu bilmeden bu işe yaramaz.
mikl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.