New to Java Script
New to Java Script

Reputation: 83

Better approach to use zip to append tuples in lists inside a list in sequence

I want to use zip to combine the result where the values should append to the corresponding persons

Assuming I have a list that includes multiple lists something like this:

list_a:

[[('person_1', 6), ('person_2', 3), ('person_3', 7), ('person_4', 6), ('person_5', 12), ('person_6', 1), ('person_7', 1)], 
[('person_1', 3), ('person_2', 3), ('person_3', 0), ('person_4', 3), ('person_5', 1), ('person_6', 0), ('person_7', 0)], 
[('person_1', 3), ('person_2', 4), ('person_3', 0), ('person_4', 3), ('person_5', 3), ('person_6', 0), ('person_7', 0)], 
[('person_1', 1), ('person_2', 3), ('person_3', 0), ('person_4', 3), ('person_5', 0), ('person_6', 0), ('person_7', 0)], 
[('person_1', 9), ('person_2', 2), ('person_3', 3), ('person_4', 6), ('person_5', 6), ('person_6', 0), ('person_7', 1)], 
[('person_1', 0), ('person_2', 1), ('person_3', 0), ('person_4', 0), ('person_5', 1), ('person_6', 0), ('person_7', 0)], 
[('person_1', 7), ('person_2', 2), ('person_3', 4), ('person_4', 6), ('person_5', 5), ('person_6', 0), ('person_7', 1)],
[('person_1', 7), ('person_2', 2), ('person_3', 4), ('person_4', 6), ('person_5', 5), ('person_6', 0), ('person_7', 1)]]

Desire outcome

[('person_1', 6, 3, 3, 1, 9, 0, 7, 7), ('person_2', 3, 3, 4, 3, 2, 1, 2, 2), ('person_3', 7, 0, 0, 0, 3, 0, 4, 4), ('person_4', 6, 3, 3, 3, 6, 0, 6, 6), ('person_5', 12, 1, 3, 0, 6, 1, 5, 5), ('person_6', 1, 0, 0, 0, 0, 0, 0, 0), ('person_7', 1, 0, 0, 0, 1, 0, 1, 1)]

Here is what I have done to achieve the goal but I wanted to know if there is a better way or cleaver solution to do this. Any suggestions are appreciated

def merge(data):
    data_sort = list()

    for i in range(len(data[1:])):
        x = data[1:][i]
        data_list = list(zip(*x))[1]
        data_sort.append(data_list)

    data_result = list(zip(*data_sort)) 

    return data_result

def main():

    list_b = merge(list_a)
    list_c = [(person, c_0, c_1, c_2, c_3, c_4, c_5, c_6, c_7) for ((person, c_0), c_1, c_2, c_3, c_4, c_5, c_6, c_7) in zip(list_a[0], list_b[0], list_c[1], list_c[2], list_c[3], list_c[4], list_c[5], list_c[6])]

if __name__ == '__main__':
    main()

Upvotes: 1

Views: 219

Answers (1)

Rakesh
Rakesh

Reputation: 82765

This is one approach using list comprehension with list/tuple unpacking *

Ex:

data = [[('person_1', 6), ('person_2', 3), ('person_3', 7), ('person_4', 6), ('person_5', 12), ('person_6', 1), ('person_7', 1)], 
[('person_1', 3), ('person_2', 3), ('person_3', 0), ('person_4', 3), ('person_5', 1), ('person_6', 0), ('person_7', 0)], 
[('person_1', 3), ('person_2', 4), ('person_3', 0), ('person_4', 3), ('person_5', 3), ('person_6', 0), ('person_7', 0)], 
[('person_1', 1), ('person_2', 3), ('person_3', 0), ('person_4', 3), ('person_5', 0), ('person_6', 0), ('person_7', 0)], 
[('person_1', 9), ('person_2', 2), ('person_3', 3), ('person_4', 6), ('person_5', 6), ('person_6', 0), ('person_7', 1)], 
[('person_1', 0), ('person_2', 1), ('person_3', 0), ('person_4', 0), ('person_5', 1), ('person_6', 0), ('person_7', 0)], 
[('person_1', 7), ('person_2', 2), ('person_3', 4), ('person_4', 6), ('person_5', 5), ('person_6', 0), ('person_7', 1)],
[('person_1', 7), ('person_2', 2), ('person_3', 4), ('person_4', 6), ('person_5', 5), ('person_6', 0), ('person_7', 1)]]


result = [[*i] + [j for _, j in values] for i, *values in zip(*data) ]
print(result)

Output:

[['person_1', 6, 3, 3, 1, 9, 0, 7, 7],
 ['person_2', 3, 3, 4, 3, 2, 1, 2, 2],
 ['person_3', 7, 0, 0, 0, 3, 0, 4, 4],
 ['person_4', 6, 3, 3, 3, 6, 0, 6, 6],
 ['person_5', 12, 1, 3, 0, 6, 1, 5, 5],
 ['person_6', 1, 0, 0, 0, 0, 0, 0, 0],
 ['person_7', 1, 0, 0, 0, 1, 0, 1, 1]]

Upvotes: 2

Related Questions