I am a newbie trying to insert elements after the n:th element in the list. Any shorter/smarter ways?
def InsertElements(listName, var1, var2, n):
listName.insert(n, var1)
listName.insert(n+1, var2)
return listName
myList = ["banana", "orange", "apple", "cherry", "grape"]
result = InsertElements(myList, "mango", "papaya", 3)
2 Answers 2
Many languages (e.g. JavaScript, Perl) have a splice
function of some sort to modify list contents. They allow you to insert list items or change existing ones to new sublists.
Python uses a "slice" approach, allowing you to specify many list edits without a specific splice function.
>>> myList = ["banana", "orange", "apple", "cherry", "grape"]
>>> myList[3:3] = ["mango", "papaya"]
>>> myList
['banana', 'orange', 'apple', 'mango', 'papaya', 'cherry', 'grape']
By the way, if this is hard to understand, this cheat sheet may help:
["banana", "orange", "apple", "cherry", "grape"]
0_______ 1_______ 2______ 3_______ 4______ 5 # item index
0:1_____ 1:2_____ 2:3____ 3:4_____ 4:5____ # equiv slice notation
^ ^ ^ ^ ^ ^ # slice notation for
0:0 1:1 2:2 3:3 4:4 5:5 # 0_length positions
# between items
0:2________________ 2:5_______________________ # misc longer slice
1:4_________________________ # examples
1:5_________________________________
1:__________________________________
0:____________________________________________
:_____________________________________________
:3__________________________
:1______
There are also negative indices (counting from the end of the list). Let's not get into those right now!
-
\$\begingroup\$ One thing I wish I'd explained a little better: When you ask a list for a single value (e.g.
mylist[3]
) you get back a single item. If you use the slice notation, you get back a list. Slices are also indexing, but they do not reduce the dimensionality of the result like integer indices do. \$\endgroup\$Jonathan Eunice– Jonathan Eunice2017年11月30日 15:45:58 +00:00Commented Nov 30, 2017 at 15:45
Note that .insert
will modify the list in-place, so after the call result
and myList
will refer to the same list.
Your code is OK. If you wanted a bit of a shorter option, you could use slicing:
listName[n:n] = [var1, var2]
This inserts both var1 and var2 after the nth item in the list.
newlist = list[:n] + added_elements + list[n:]
. \$\endgroup\$insert()
modifies your list so you can simply call your list after running your function without the need of a return inside it. \$\endgroup\$