Xuemei
Xuemei

Reputation: 219

Repeat elememts based on another elements in the nested list

I have a nested list e.g., ls=[((0,3),(1,0),(2,2),(3,0)),((0,0),(1,3),(2,2),(3,0))].

And I would like to have the following modified list:

modified_ls=[((0,0),(0,0),(0,0),(1,0),(2,0),(2,0),(3,0)),((0,0),(1,0),(1,0),(1,0),(2,0),(2,0),(3,0))]

There the element (x,0) in modified_ls is repeated by N (N!=0) times which is based on the element (x, N) in ls.

Here is what I do (quite stupid):

ls=[((0,3),(1,0),(2,2),(3,0)),((0,0),(1,3),(2,2),(3,0))]
modified_temp_ls=[]
for ii in ls:
    
    for jj in ii:
        temp=jj[1]
        if temp==0:
            modified_temp_ls.append(jj) 
        else:
            while temp:
                modified_temp_ls.append((jj[0],0))
                temp-=1
                

ls2=modified_temp_ls[0:int(len(modified_temp_ls)/2)]
ls3=modified_temp_ls[int(len(modified_temp_ls)/2):int(len(modified_temp_ls))]
modified_ls=[]
modified_ls.append(tuple(ls2))
modified_ls.append(tuple(ls3))

Are there any simple way to do it (e.g, without using ls2 and ls3, etc.)? Thank you very much in advance for any suggestions!

Upvotes: 0

Views: 43

Answers (1)

Tim Roberts
Tim Roberts

Reputation: 54698

This is just list manipulation. Generate the individual sequences, then use sum to combine them into a single list.

ls=[((0,3),(1,0),(2,2),(3,0)),((0,0),(1,3),(2,2),(3,0))]
accum = []
for k in ls:
    accum.append(sum([ [(i,0)]*max(1,n) for i,n in k ],[]))
print(accum)

Output:

[[(0, 0), (0, 0), (0, 0), (1, 0), (2, 0), (2, 0), (3, 0)], [(0, 0), (1, 0), (1, 0), (1, 0), (2, 0), (2, 0), (3, 0)]]

Or for the obligatory one liner:

ls=[((0,3),(1,0),(2,2),(3,0)),((0,0),(1,3),(2,2),(3,0))]
accum = [sum([[(i,0)]*max(1,n) for i,n in k ],[]) for k in ls]

Upvotes: 1

Related Questions