Python: Итерируя списки с разным количеством измерений, существует общий способ?

# 2x3 dimensional list
multidim_list = [ 
                  [1,2,3],
                  [4,5,6],    
                ]
# 2x3x2 dimensional list
multidim_list2 = [ 
                   [ 
                     [1,2,3],
                     [4,5,6],  
                   ],
                   [ 
                     [7,8,9],
                     [10,11,12],  
                   ]
                 ]

def multiply_list(list):
    ...

Я хотел бы реализовать функцию, которая будет умножать все элементы в списке на два. Однако моя проблема заключается в том, что списки могут иметь разные размеры.

Есть ли общий способ циклического/повторения многомерного списка и, например, умножить каждое значение на два?

EDIT1: Спасибо за быстрые ответы. В этом случае я не хочу использовать numpy. Рекурсия кажется хорошей, и даже не нужно делать копию списка, что может быть довольно большим на самом деле.

Ответ 1

Рекурсия - ваш друг:

from collections import MutableSequence
def multiply(list_):
    for index, item in enumerate(list_):
        if isinstance(item, MutableSequence):
            multiply(item)
        else:
            list_[index] *= 2

Вы можете просто сделать isinstance(item, list) вместо isinstance(item, MutableSequence), но последний способ более надежный и универсальный. См. глоссарий для краткого объяснения.

Ответ 2

Вы можете использовать numpy:

import numpy as np

arr_1 = np.array(multidim_list)
arr_2 = np.array(multidim_list2)

Результат:

>>> arr_1*2
array([[ 2,  4,  6],
       [ 8, 10, 12]])
>>> arr_2*2
array([[[ 2,  4,  6],
        [ 8, 10, 12]],

       [[14, 16, 18],
        [20, 22, 24]]])

Ответ 3

numpy массивы делают это из коробки.