Python: доступ к элементам многомерного списка, с учетом списка индексов

У меня есть многомерный список F, содержащий элементы некоторого типа. Итак, если, например, ранг равен 4, то к элементам F можно получить что-то вроде F[a][b][c][d] .

Учитывая список L=[a,b,c,d] , я хотел бы получить доступ к F[a][b][c][d] . Моя проблема в том, что мой ранг будет меняться, поэтому я не могу просто иметь F[L[0]][L[1]][L[2]][L[3]] .

В идеале я хотел бы иметь возможность F[L] и получить элемент F[a][b][c][d] . Я думаю, что что-то подобное можно сделать с помощью numpy, но для типов массивов, которые я использую, numpy не подходит, поэтому я хочу сделать это с помощью списков python.

Как я могу сделать что-то подобное выше?

EDIT: Для конкретного примера того, что я пытаюсь достичь, см. Демонстрацию в ответе Мартинна.

2 Solutions collect form web for “Python: доступ к элементам многомерного списка, с учетом списка индексов”

Вы можете использовать функцию reduce() для доступа к следующим элементам:

 from functools import reduce # forward compatibility import operator reduce(operator.getitem, indices, somelist) 

В Python 3 reduce было перенесено в модуль functools , но в Python 2.6 и выше вы всегда можете получить доступ к нему в этом месте.

В приведенном выше somelist используется функция operator.getitem() для применения каждого индекса к предыдущему результату (начиная с somelist ).

Демо-версия:

 >>> import operator >>> somelist = ['index0', ['index10', 'index11', ['index120', 'index121', ['index1220']]]] >>> indices = [1, 2, 2, 0] >>> reduce(operator.getitem, indices, somelist) 'index1220' 

Что-то вроде этого?

 def get_element(lst, indices): if indices: return get_element(lst[indices[0]], indices[1:]) return lst 

Контрольная работа:

 get_element([[["element1"]], [["element2"]], "element3"], [2]) 'element3' get_element([[["element1"]], [["element2"]], "element3"], [0, 0]) ['element1'] 

Или если вы хотите итеративную версию:

 def get_element(lst, indices): res = lst for index in indices: res = res[index] return res 

Контрольная работа:

 get_element([[["element1"]], [["element2"]], "element3"], [1, 0]) ['element2'] 
  • Преобразование вложенных списков данных в многомерные массивы Numpy
  • Могу ли я расширить список в Python с помощью дополнительных элементов вместо добавления?
  • Каков наиболее эффективный способ перебора списка в python?
  • Список пифонических кругов
  • список python в dict
  • добавить к подсписку, прилагается к каждому подсписку
  • Удалите дубликаты в списке, сохраняя при этом его порядок (Python)
  • difflib.get_close_matches выкидывают имена в списке, если первый ответ неверен
  • Python - лучший язык программирования в мире.