2012-03-26 3 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) 

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

EDIT: Может быть, простой цикл является лучшим выбором:

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

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

Например:

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) находится внутри dict, иначе он будет создан по заданию)

+0

Умное решение! Тем не менее, мой массив на самом деле является непрерывным ctypes.c_float, не может использовать словари там. Хороший ответ, тем не менее. –

Смежные вопросы