Insert element in Python list after every nth element
I've got two one liners.
Given:
>>> letters = ['a','b','c','d','e','f','g','h','i','j']
Use
enumerate
to get index, add'x'
every 3rd letter, eg:mod(n, 3) == 2
, then concatenate into string andlist()
it.>>> list(''.join(l + 'x' * (n % 3 == 2) for n, l in enumerate(letters)))['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j']
But as @sancho.s points out this doesn't work if any of the elements have more than one letter.
Use nested comprehensions to flatten a list of lists(a), sliced in groups of 3 with
'x'
added if less than 3 from end of list.>>> [x for y in (letters[i:i+3] + ['x'] * (i < len(letters) - 2) for i in xrange(0, len(letters), 3)) for x in y]['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j']
(a) [item for subgroup in groups for item in subgroup]
flattens a jagged list of lists.
Try this
i = nwhile i < len(letters): letters.insert(i, 'x') i += (n+1)
where n
is after how many elements you want to insert 'x'
.
This works by initializing a variable i
and setting it equal to n
. You then set up a while
loop that runs while i
is less then the length of letters
. You then insert 'x'
at the index i
in letters
. Then you must add the value of n+1
to i
. The reason you must do n+1
instead of just n
is because when you insert an element to letters
, it expands the length of the list by one.
Trying this with your example where n
is 3 and you want to insert 'x'
, it would look like this
letters = ['a','b','c','d','e','f','g','h','i','j']i = 3while i < len(letters): letters.insert(i, 'x') i += 4print letters
which would print out
['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j']
which is your expected result.