ย้ายรายการภายในรายการ?


คำตอบ:


160

ใช้insertวิธีการของรายการ:

l = list(...)
l.insert(index, item)

หรือคุณสามารถใช้สัญกรณ์สไลซ์:

l[index:index] = [item]

หากคุณต้องการย้ายรายการที่มีอยู่แล้วในรายการไปยังตำแหน่งที่ระบุคุณจะต้องลบและแทรกในตำแหน่งใหม่:

l.insert(newindex, l.pop(oldindex))

22
เพียงจำไว้ว่าการย้ายรายการที่มีอยู่แล้วในรายการด้วยวิธีการแทรก / ป๊อปจะมีลักษณะการทำงานที่แตกต่างกันขึ้นอยู่กับว่าคุณกำลังเคลื่อนไปด้านหน้าหรือด้านหลังของรายการ เลื่อนไปทางซ้ายที่คุณแทรกก่อนวัตถุที่คุณเลือก ย้ายไปด้านหลังที่คุณแทรกหลังจากรายการที่คุณเลือก ตรวจสอบการย้ายไปยังส่วนท้ายของรายการ (ข้อผิดพลาดของดัชนี)
MKaras

จะย้ายหลายองค์ประกอบได้อย่างไร? ระบุรายการ a = [1,2,3,4,5,6,7,8,9] วิธีแปลงเป็น [1,2, [3,4,5], 6,7,8,9 ]? สามารถทำได้ในขั้นตอนเดียวหรือด้วยความเข้าใจในรายการ?
g33kz0r

@MKaras ฉันทดสอบสิ่งนี้ด้วย Python 3.5 และคุณสามารถแทรกได้last index + 1โดยไม่มีข้อผิดพลาด องค์ประกอบจะถูกผนวกเข้ากับรายการในกรณีนั้น
user2061057

@ user2061057 ถูกต้อง :) แม้ดัชนีขนาดใหญ่จะส่งผลให้สิ่งต่างๆแทรกในตอนท้าย a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
lee penkman

1
สำหรับผู้ที่พยายามใช้ดัชนี -1 เพื่อแทรกรายการต่อท้ายคุณต้องใช้ len (l) แทน
nda

32

วิธีแก้ปัญหาที่สั้นกว่าเล็กน้อยซึ่งจะย้ายรายการไปยังจุดสิ้นสุดเท่านั้นไม่ใช่ที่ใดก็ได้คือ:

l += [l.pop(0)]

ตัวอย่างเช่น:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

13
l.append(l.pop(0))คุณอาจรวมทั้งใช้ ยาวขึ้นเพียงเล็กน้อย แต่อ่านได้ง่ายกว่ามาก
coredumperror

ฉันจะย้ายไปยังจุดเริ่มต้นแทนได้อย่างไร

21

หากคุณไม่ทราบตำแหน่งของรายการคุณอาจต้องหาดัชนีก่อน:

old_index = list1.index(item)

จากนั้นย้าย:

list1.insert(new_index, list1.pop(old_index))

หรือ IMHO วิธีที่สะอาดกว่า:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass

6
ผมคิดว่าผมเหมาะสมที่จะประจบประแจงที่คุณpassคำสั่ง ... ไม่เคยยกเว้นซ่อน - สิ่งที่เริ่มต้นในตัวอย่างเช่นนี้ควรจะให้คำสั่งที่ผิดพลาดทำความสะอาดหรือพิมพ์คำสั่ง ... หรือraise ValueError(f'Unable to move item to {new_index}') print(f'Moving item to {new_index} failed. List remains unchanged.')อาจpassจะใช้ได้ถ้าอยู่ในฟังก์ชันที่เรียกว่าtry_to_move_itemหรือบางอย่างเพื่อให้เข้าใจว่าการดำเนินการอาจล้มเหลวอย่างเงียบ ๆ
flutefreak7

3

วิธีแก้ปัญหาง่ายมาก แต่คุณต้องรู้ดัชนีของตำแหน่งเดิมและดัชนีของตำแหน่งใหม่:

list1[index1],list1[index2]=list1[index2],list1[index1]

8
นี่คือการแลกเปลี่ยนไม่ใช่การย้าย
juzzlin

0

ฉันรวบรวมวิธีการสองสามวิธีในการย้ายรายการภายในรายการเดียวกันด้วย timeit นี่คือสิ่งที่จะใช้ถ้า j> i:

┌──────────┬──────────────────────┐
│ 14.4usec │ x [i: i] = x.pop (ญ), │
│ 14.5usec │ x [i: i] = [x.pop (ญ)] │
│ 15.2usec │ x.insert (i, x.pop (j)) │
└──────────┴──────────────────────┘

และนี่คือสิ่งที่จะใช้ถ้า j <= i:

┌──────────┬───────────────────────────┐
│ 14.4usec │ x [i: i] = x [j],; เดล x [j] │
│ 14.4usec │ x [i: i] = [x [j]]; เดล x [j] │
│ 15.4usec │ x.insert (i, x [j]); เดล x [j] │
└──────────┴───────────────────────────┘

ไม่ใช่ความแตกต่างอย่างมากหากคุณใช้งานเพียงไม่กี่ครั้ง แต่ถ้าคุณทำของหนัก ๆ เช่นการจัดเรียงด้วยตนเองสิ่งสำคัญคือต้องดำเนินการให้เร็วที่สุด ไม่เช่นนั้นฉันขอแนะนำให้ใช้สิ่งที่คุณคิดว่าอ่านได้ง่ายที่สุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.