แนวทางที่มีประสิทธิภาพสูงสุด
นอกจากนี้คุณยังสามารถแทรกองค์ประกอบโดยใช้การสร้างดัชนีชิ้นในรายการ ตัวอย่างเช่น:
>>> a = [1, 2, 4]
>>> insert_at = 2
>>> b = a[:]
>>> b[insert_at:insert_at] = [3]
>>> b
[1, 2, 3, 4]
สำหรับการแทรกหลายองค์ประกอบเข้าด้วยกันในดัชนีที่กำหนดสิ่งที่คุณต้องทำคือใช้list
องค์ประกอบหลายรายการที่คุณต้องการแทรก ตัวอย่างเช่น:
>>> a = [1, 2, 4]
>>> insert_at = 2
>>> insert_elements = [3, 5, 6]
>>> a[insert_at:insert_at] = insert_elements
>>> a
[1, 2, 3, 5, 6, 4]
ทางเลือกในการใช้ความเข้าใจรายการ (แต่ช้ามากในแง่ของประสิทธิภาพ) :
อีกทางเลือกหนึ่งคือสามารถทำได้โดยใช้ความเข้าใจในรายการด้วยenumerate
เช่นกัน (แต่โปรดอย่าทำแบบนี้เป็นเพียงภาพประกอบ) :
>>> a = [1, 2, 4]
>>> insert_at = 2
>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]
การเปรียบเทียบประสิทธิภาพของโซลูชันทั้งหมด
นี่คือการtimeit
เปรียบเทียบคำตอบทั้งหมดพร้อมรายการองค์ประกอบ 1,000 รายการสำหรับ Python 3.4.5:
คำตอบของฉันโดยใช้การแทรกแบบแบ่งส่วน - เร็วที่สุด (3.08 µsec ต่อวง)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
100000 loops, best of 3: 3.08 µsec per loop
คำตอบที่ยอมรับของ ATOzTOAโดยพิจารณาจากการรวมรายการแบบแบ่งส่วน - วินาที (6.71 µsec ต่อวง)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
100000 loops, best of 3: 6.71 µsec per loop
คำตอบของ Rushy Panchal ที่มีผู้โหวตมากที่สุดโดยใช้list.insert(...)
- อันดับสาม (26.5 usec ต่อวง)
python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
10000 loops, best of 3: 26.5 µsec per loop
คำตอบของฉันพร้อมความเข้าใจในรายการและenumerate
- ประการที่สี่ (ช้ามาก 168 µsec ต่อวง)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
10000 loops, best of 3: 168 µsec per loop
b = a[:].insert(2,3)
ดูเหมือนจะค่อนข้างสั้นไม่มีผลกับรายการต้นฉบับและเป็นคำอธิบายที่ค่อนข้างชัดเจน