我想要一个函数调用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)
您需要首先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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |