2012-03-26 74 views
1

假设我有(1, 2, 3)一个元组,并希望指数多维数组与它如:索引阵列与一个元组

index = (1, 2, 3) 
table[index] = 42 # behaves like table[1][2][3] 

index有一个未知的维数,所以我不能做的:

table[index[0]][index[1]][index[2]] 

我知道我可以做这样的事情:

functools.reduce(lambda x, y: x[y], index, table) 

但它的完全丑陋(也许还是效率低下),所以我想知道是否有更好,更多Pythonic的选择。

编辑:也许一个简单的循环是最好的选择:

elem = table 
for i in index: 
    elem = elem[i] 

EDIT2:其实,有一个与这两个解决方案的一个问题:我无法将值分配给索引数组:-(,回丑:

elem = table 
for i in index[:-1]: 
    elem = elem[i] 
elem[index[-1]] = 42 

回答

3

的问题是非常有趣的,也是你的建议的解决方案看起来很不错(没有带检查,但这种问题,需要一个递归处理,你只要在一行中)。 但是,我在我的程序中使用的pythonic方式是使用元组字典。这个语法是类似数组的,是一个字典的表现,对我来说没有任何问题。

例如:

a = {(1, 2, 3): 'A', (3, 4, 5): 'B', (5, 6, 7, 8): 'C'} 
print a[1, 2, 3] 
print a[5, 6, 7, 8] 

将输出:

A 
B 

和分配到的指标是超级简单: a[1, 4, 5] = 42。 (但你可能要先检查(1,4,5)是否在字典中,否则将由作业创建)

+0

聪明的解决方案!但是,我的数组实际上是一个连续的ctypes.c_float,不能在那里使用字典。好的回答。 – 2012-03-26 23:12:54