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)]
功劳归于他。非常感谢!
假设我有一个多维数组,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)]
功劳归于他。非常感谢!