Home > front end >  How to manipulate a list with recursive function?
How to manipulate a list with recursive function?

Time:10-27

I'm trying to manipulate a given list in an unusual way (at least for me).

Basically, I have the list a (also image 1), it has the first index as principal. Now, I want to iterate through the other indexes and if a certain value match with one of those in the first index, I want to insert the sublist of this index inside the first one.

I don't know if I was clear enough, but the goal should be the list b (also image 2). I think a recursive function should be used here, but I don't know how. Do you guys think it's possible?

Original list:

a = [[1,2,3],[2,5],[6,3],[10,5]]

Expected Output:

b = [[1,2,[2,5,[10,5]],3,[6,3]]]

enter image description here

enter image description here

CodePudding user response:

You could use a dictionary to record where the first occurrence of each number is found, recording the list in which it was found, and at which index. If then a list is found that has a value that was already encountered, the recorded list can be mutated having the matching list inserted. If there was no match (which is the case for the very first list [1,2,3]), then this list is just appended to the result.

Because insertion into a list will impact other insertion points, I suggest to first collect the insertion actions, and then apply them in reversed order:

Here is the code for that:

def solve(a):
    dct = {}
    result = []
    insertions = []
    for lst in a:
        found = None
        for i, val in enumerate(lst):
            if val in dct:
                found = val
            else:
                dct[val] = [lst, i]
        if found is None:
            result.append(lst)
        else:
            insertions.append((*dct[found], lst))

    for target, i, lst in reversed(insertions):
        target.insert(i   1, lst)
        
    return result


# Example run:
a = [[1,2,3],[2,5],[6,3],[10,5]]
print(solve(a))

Output:

[[1, 2, [2, 5, [10, 5]], 3, [6, 3]]]
  • Related