Python: преобразовать список списков кортежей

Предположим, что у меня есть структура данных следующим образом:

[[ tuple11, tuple12, ... ], [ tuple21, tuple22, ... ], ...] 

То есть внешний список может иметь любое количество элементов, и каждый элемент (список) может содержать любое количество элементов (кортежей). Как я могу преобразовать его в:

 [[ tuple11, tuple21, ... ], [ tuple12, tuple22, ... ], ... ] 

У меня есть следующее решение, работающее для двух элементов во внешнем списке, но я не могу понять, как его обобщить:

 map(lambda x, y: [x, y], *the_list) 

Добавлено:

Чтобы добавить более подробную информацию, каждый из перечисленных выше наборов на самом деле является кортежем из двух np.array s.

Если я начну со следующей структуры данных:

 [[(array([111, 111]), array([121, 121])), (array([112, 112]), array([122, 122])), (array([131, 131]), array([141, 141])), (array([132, 132]), array([142, 142]))], [(array([211, 211]), array([221, 221])), (array([212, 212]), array([222, 222])), (array([231, 231]), array([241, 241])), (array([232, 232]), array([242, 242]))]] 

Мне нужно превратить это в:

 [[(array([111, 111]), array([121, 121])), (array([211, 211]), array([221, 221]))], [(array([112, 112]), array([122, 122])), (array([212, 212]), array([222, 222]))], [(array([131, 131]), array([141, 141])), (array([231, 231]), array([241, 241]))], [(array([132, 132]), array([142, 142])), (array([232, 232]), array([242, 242]))]] 

Обратите внимание, что массивы не всегда 1✕2, но 1✕N вообще для любого положительного N. В каждом кортеже всегда есть два массива, но любое количество кортежей в каждом внутреннем списке и любое количество этих внутренних списков во внешнем списке.

Я довольно привык к жонглированию массивов NumPy, но у меня очень мало опыта с собственными списками, кортежами и т. Д.

Вам нужны столбцы, поэтому вы можете использовать функцию zip :

 zip(*main_list) 

Но так как он возвращает столбцы в формате tuple, если вы хотите только список, вы можете использовать map для преобразования их в список:

 map(list,zip(*main_list)) 

Демо-версия:

 >>> main_list=[[(1,2),(3,4)],[(5,6),(7,8)]] >>> zip(*main_list) [((1, 2), (5, 6)), ((3, 4), (7, 8))] 

И с вашим примером:

 >>> main_list=[[(np.array([111, 111]), np.array([121, 121])), ... (np.array([112, 112]), np.array([122, 122])), ... (np.array([131, 131]), np.array([141, 141])), ... (np.array([132, 132]), np.array([142, 142]))], ... [(np.array([211, 211]), np.array([221, 221])), ... (np.array([212, 212]), np.array([222, 222])), ... (np.array([231, 231]), np.array([241, 241])), ... (np.array([232, 232]), np.array([242, 242]))]] >>> >>> zip(*main_list) [((array([111, 111]), array([121, 121])), (array([211, 211]), array([221, 221]))), ((array([112, 112]), array([122, 122])), (array([212, 212]), array([222, 222]))), ((array([131, 131]), array([141, 141])), (array([231, 231]), array([241, 241]))), ((array([132, 132]), array([142, 142])), (array([232, 232]), array([242, 242])))] 

Кажется, я нашел решение. Я не считаю его элегантным, но, по крайней мере, он работает. Назовем исходный список списков кортежей main_list и преобразованный список списков кортежей new_list :

 def transform_coeff_struct(main_list): new_list = [] for ii, inner_list in enumerate(main_list): for jj, some_tuple in enumerate(inner_list): if ii==0: new_list.append([some_tuple,]) else: new_list[jj].append(some_tuple) return new_list