Reputation: 5389
I want to merge element in the list based on given start and stop index of tuple (non-overlap for tuple). I'll leave the indices that don't mention as it is. This is my example
ls = ['1', '2', '3', '4', '5', '6', '7']
merge = [(1, 3), (5, 7)]
Here, I want to merge index from [1:3]
together and [5:7]
together so the output should look something like following
['1', '23', '4', '5', '67']
I tried to loop using range(len(ls))
but it doesn't seem to be the right way to tackle this problem. Let me know if someone has simple way to solve this problem.
Upvotes: 3
Views: 4207
Reputation: 1521
For the fun of it, because I've been learning Haskell, a recursive solution:
def recursive(ls, merge):
if merge == []:
return ls
else:
x, xs = merge[0], merge[1:]
return ls[:x[0]] + [''.join(ls[x[0]:x[1]])] + recursive(ls, xs)[x[1]:]
Only works if there are no overlapping intervals, however.
Upvotes: 1
Reputation: 92854
Short "trick" with reversed merge
list:
ls = ['1', '2', '3', '4', '5', '6', '7']
merge = [(1, 3), (5, 7)]
for t in merge[::-1]:
merged = ''.join(ls[t[0]:t[1]]) # merging values within a range
ls[t[0]:t[1]] = [merged] # slice replacement
print(ls)
The output:
['1', '23', '4', '5', '67']
Upvotes: 3
Reputation: 2834
A quick-and-dirty solution would be:
ls = ['1', '2', '3', '4', '5', '6', '7']
merge = [(1, 3), (5, 7)]
result = []
index = 0
for start, end in merge:
result += ls[index:start]
result.append("".join(ls[start:end]))
index = end
print result # ['1', '23', '4', '5', '67']
Upvotes: 7