Python - 枚举多维列表

Python - enumerate a multidimensional list

假设我有一个多维数组,foobar:

foobar = [[[0, 1, 2],
           [3, 4, 5, 6],
           [7, 8]],
          [[9, 10],
           [11, 12, 13, 14, 15],
           [16, 17, 18],
           [19, 20, 21, 22]],
          [[23, 24, 25],
           [26, 27]]]

请注意 foobar 是锯齿状的。

我需要做的是将 foobar 中的每个数字替换为包含该数字及其在 foobar 中的确切位置的元组。当维数以及 foobar 是否锯齿未知时,我还需要能够执行此操作。

这里有类似的东西,只是它只适用于二维:

def enum_multidim(data):
    for i, a in enumerate(data):
        for j, b in enumerate(a):
            yield (i, j, b)

是否有一个用户定义的函数可以完成我上面所说的?

任意维数的递归生成器

代码

def enum_multidim(data, t = None):
    if t is None:
        t = ()
    if not isinstance(data, list):
        yield t + (data,)
    else:
        for i, v in enumerate(data):
            yield from enum_multidim(v, t + (i,))

测试

for t in enum_multidim(foobar):
    print(t)

# Out:
(0, 0, 0, 0)
(0, 0, 1, 1)
(0, 0, 2, 2)
(0, 1, 0, 3)
(0, 1, 1, 4)
(0, 1, 2, 5)
(0, 1, 3, 6)
(0, 2, 0, 7)
(0, 2, 1, 8)
(1, 0, 0, 9)
(1, 0, 1, 10)
(1, 1, 0, 11)
(1, 1, 1, 12)
(1, 1, 2, 13)
(1, 1, 3, 14)
(1, 1, 4, 15)
(1, 2, 0, 16)
(1, 2, 1, 17)
(1, 2, 2, 18)
(1, 3, 0, 19)
(1, 3, 1, 20)
(1, 3, 2, 21)
(1, 3, 3, 22)
(2, 0, 0, 23)
(2, 0, 1, 24)
(2, 0, 2, 25)
(2, 1, 0, 26)
(2, 1, 1, 27)

所以,我看到了 DarryIG 的回答并修改了它以适合我的风格:

def get_dims(data): # some other function I use
    if not isinstance(data, itertypes):
        return 0
    return get_dims(data[0]) + 1
def enum_multidim(data, index = []):
    if get_dims(data) == 0:
        return index + [data]
    return [enum_multidim(x, index + [i]) for i, x in enumerate(data)]

功劳归于他。非常感谢!