Индексирование массива с помощью кортежа - PullRequest
1 голос
/ 27 марта 2012

Предположим, у меня есть кортеж (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)

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

РЕДАКТИРОВАТЬ: Может быть лучший выбор простой цикл:

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

EDIT2: На самом деле, существует проблема с обоими решениями: я не могу присвоить значение индексированному массиву :-(, обратно к уродливому:

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

1 Ответ

3 голосов
/ 27 марта 2012

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

Например:

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, иначе это будет создано назначением)

...