วิธีสลับตำแหน่งของสองรายการในรายการ Python ได้อย่างไร


208

ฉันไม่สามารถหาทางออกที่ดีสำหรับปัญหานี้ในเน็ต (อาจเป็นเพราะสวิตช์ตำแหน่งรายการและ Python เป็นคำที่ใช้บ่อยเกินไป)

มันค่อนข้างง่าย - ฉันมีรายการนี้:

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

ฉันต้องการเปลี่ยนตำแหน่ง'password2'และ'password1'- ไม่ทราบตำแหน่งที่แน่นอนของพวกเขาเฉพาะเมื่อพวกเขาอยู่ติดกันและpassword2เป็นคนแรก

ฉันทำสิ่งนี้สำเร็จด้วยการเขียนลิสต์ยาว ๆ แต่ฉันสงสัยว่ามันมีความเป็นไปได้ที่จะมีบางสิ่งที่ดูหรูหรากว่านี้อีกไหม?


ปัญหาของคุณคือประสิทธิภาพของการพยายามค้นหา 'password2' ในรายการหรือไม่ 'password1' มาก่อน 'password2' ได้หรือไม่ มีความซับซ้อนที่นี่ที่ไม่ได้พบในคำถามเดิมของคุณ? มิฉะนั้นฉันเห็นด้วยกับ @unwind
Brent Writes Code

3
คุณควรโพสต์สิ่งที่คุณมี - ฉันอยากรู้ว่าคุณหมายถึงอะไรโดย "ลิสต์รายการที่ค่อนข้างยืดยาว"
samtregar

บางสิ่งบางอย่างตามสายของ index1 = index ('password1'); index2 = index ('password2'); order = order [: index2]. ผนวก (order [index1]) ผนวก (order [index2]) ผนวก (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 swap ง่าย ๆ มีลักษณะดังนี้:

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

หากคุณพบว่าสามารถอ่านได้มากขึ้น


เหตุใดจึงไม่ทำงานหากคุณต้องการสลับชื่อและเมลองค์ประกอบแรกเป็นรายการที่สอง
Luigi Tiburzi

ขออภัยตอนนี้ฉันเข้าใจไม่มีองค์ประกอบที่ i-1 ดังนั้นรายการว่างจะถูกส่งกลับ
Luigi Tiburzi

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]
Brent Writes Code

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

ฉันไม่ใช่ผู้เชี่ยวชาญในงูหลาม แต่คุณสามารถลองพูดได้

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.