Reputation: 83
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
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