P121: Insert an element at a given position into a list
往列表中按指定位置插入元素。照例测试用例:
from python99.lists.p121 import insert_at, insert_at_mutable
def test_insert_at():
assert insert_at([1, 2, 3, 4, 5, 6], 2, 'a') == [1, 'a', 2, 3, 4, 5, 6]
assert insert_at([1, 2, 3, 4, 5, 6], 1, 'a') == ['a', 1, 2, 3, 4, 5, 6]
assert insert_at([1, 2, 3, 4, 5, 6], 7, 'a') == [1, 2, 3, 4, 5, 6, 'a']
def test_insert_at_mutable():
assert insert_at([1, 2, 3, 4, 5, 6], 2, 'a') == [1, 'a', 2, 3, 4, 5, 6]
assert insert_at([1, 2, 3, 4, 5, 6], 1, 'a') == ['a', 1, 2, 3, 4, 5, 6]
assert insert_at([1, 2, 3, 4, 5, 6], 7, 'a') == [1, 2, 3, 4, 5, 6, 'a']
Python内建的数据类型list
已经提供了按位置索引直接访问元素和切片功能(Ninety-Nine Problems原来是为Prolog教学演示设计的,Prolog中的list没有切片功能,也没有索引访问功能)。
- 首先,按指定位置将列表切分为两段
- 然后,将要插入的元素放置在两段列表之间
- 最后,将两段列表及插入元素按序拼接起来
代码实现:
# Insert an element at a given position into a list
# index is 1-based
def insert_at(l,index, value):
if index <= 1:
return [value] + l
if index > len(l):
return l + [value]
return l[:index-1] + [value] + l[index-1:]
def insert_at_mutable(l, index, value):
l.insert(index-1, value)
return l