2010-03-22 41 views
122

我一直沒有找到一個很好的解決方案在網絡上的這個問題(可能是因爲開關,位置,列表和Python都是這樣重載的話)。如何在Python列表中切換兩個項目的位置?

這是相當簡單 - 我有這樣的名單:

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

我想切換的'password2''password1'位置 - 不知道他們的確切位置,只知道他們是對彼此相鄰並password2是第一個。

我已經完成了一些相當冗長的列表下標,但我想知道它有可能想出一些更優雅的東西?

+0

你的問題是試圖在列表中找到'password2'的效率嗎? 'password1'可以在'password2'之前嗎?在你的原始問題中沒有遇到複雜性嗎? 否則我同意@unwind。 – 2010-03-22 16:31:27

+3

你應該發佈你所擁有的 - 我很好奇你的意思是「相當冗長的列表下標」。 – samtregar 2010-03-22 16:33:45

+0

沿着index1 = index('password1')的行; index2 = index('password2'); order = order [:index2] .append(order [index1])。append(order [index2])。append(order [index1 + 1:]);在更多的線上傳播。漂亮,沒有。 – mikl 2010-03-22 19:06:33

回答

249
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] 
5

如何以往任何時候都長於

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

這是使用臨時存儲只是一個普通的交換。

+6

如果你想真的是「Pythonic」,你也可以這樣做:'my_list [indexOfPwd2],my_list [indexOfPwd2 + 1] = my_list [indexOfPwd2 + 1],my_list [indexOfPwd2]' – 2010-03-22 16:32:36

104

簡單的Python交換看起來是這樣的:

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

現在,所有你需要做的就是數字是什麼i,並可以很容易地與index完成:

i = foo.index("password2") 
13

根據您的規格,我會使用切片分配:

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

如果您發現更具可讀性,因爲許多人會。

+0

爲什麼這不是如果你想切換標題和郵件,第一個元素與第二個? – 2013-10-26 14:29:06

+0

對不起,我現在明白了,在i-1中沒有元素,所以返回一個空列表 – 2013-10-26 14:35:33

0

可以使用例如:

>>> 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 2016-08-06 13:00:08