titipata
titipata

Reputation: 5389

Merge elements in list based on given indices

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

Answers (3)

FuzzyDuck
FuzzyDuck

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

RomanPerekhrest
RomanPerekhrest

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

Vadim Landa
Vadim Landa

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

Related Questions