在列表中的另一个值之后插入一个值

ver*_*rdy 5 python list

我想要一个函数调用insert_after,它将获取一个列表和两个值(search_value和value).

然后应该value在第一次出现后插入功能search_value

如果search_value是未在列表中,然后将其添加到年底.我想用一个try...except声明来做这件事.

例如,如果列表是:

myList = [4,2,6,7,8,1], 
Run Code Online (Sandbox Code Playgroud)

那么函数调用:

insert_after(myList, 7, 5)
Run Code Online (Sandbox Code Playgroud)

应该返回:

[4,2,6,7,5,8,1]
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了,但即使我指定了索引,我的值也会一直插入到列表的末尾.

def insert_after(list1, search_value, value):
    try:
        for i in list1:
            if i == search_value:
                list1.insert(search_value+1,value)
            else:
                list1.insert(len(list1)+1,value)
    except:
        list1.insert(len(list1)+1,value)
Run Code Online (Sandbox Code Playgroud)

Joe*_*don 5

您需要首先search_value在列表中找到索引,这可以使用该.index方法完成.然后,您可以使用该.insert方法插入value之后的位置(索引+1).

然而,我们需要在那里要考虑的情况search_value是不是在lst.为此,我们只需使用a try...except来ValueError在.index失败时捕获for .而且,在这种情况下,我们要么追加lst,要么追加.insert; 要么有效.

def insert_after(lst, search_value, value):
    try:
        lst.insert(lst.index(search_value)+1, value)
    except ValueError:
        lst.append(search_value)
        #or: lst.insert(len(lst)-1, value)
Run Code Online (Sandbox Code Playgroud)

和测试:

>>> l = [4, 2, 6, 7, 8, 1]
>>> insert_after(l, 7, 5)
>>> l
[4, 2, 6, 7, 5, 8, 1]
Run Code Online (Sandbox Code Playgroud)

为什么你的方法不起作用?

如果我们仔细查看您的主要插入行:

list1.insert(search_value+1,value)
Run Code Online (Sandbox Code Playgroud)

我们可以看到你的逻辑略有偏差.该.insert方法采用索引和值.在这里,你search_value+1作为索引传递,即使这只是值.

所以希望你能从我的代码中看到,使用该.index方法是正确的方法,因为它为我们提供了该值的索引 - 允许我们.insert正确使用.

如果你不想使用.index怎么办?

所以,是的,你可以使用a for-loop,但不是像你一样迭代这些术语,你真的想要迭代值和索引.这可以通过使用来实现enumerate().

所以,我会让你自己把它放在一个函数中,因为你可能最终会使用这个.index方法,但基本的想法是:

for i, e in enumerate(lst):
    if e == search_value:
        lst.insert(i+1, value)
Run Code Online (Sandbox Code Playgroud)