2017-02-17 11 views
0

Итак, у меня есть массив вроде ['test', 'testtwo'].Использовать массив как индекс в python

Я хочу использовать это как индекс для такого словаря myDict['test']['testtwo'].

Возможно ли это в python? Извините за короткое объяснение.

EDIT:

exampleDict = { 
    'test': { 
    'testtwo': [ 
     '', 
     '' 
    ] 
    } 
} 

И когда делать некоторые вещи в Python Я в конечном итоге с массивом ['test', 'testtwo'], а затем нужно использовать, что для доступа к exampleDict['test']['testtwo']. Клавиши меняются, и количество ключей в массиве меняется.

+3

Что такое большая картина того, что вы хотите достичь? словарь может быть тем, что вы ищете –

+0

да простите меня, я имею в виду словарь:/ –

+0

Вы имеете в виду [python dict] (https://docs.python.org/2/tutorial/datastructures.html#dictionaries) – felipsmartins

ответ

2

Вы можете либо использовать цикл, итерация индексы в списке и обновление «текущий» Dict, как вы идете:

>>> exampleDict = {'test': {'testtwo': [ '', '']}} 
>>> d = exampleDict        
>>> for x in idx: 
...  d = d[x] 
>>> d 
['', ''] 

Или вы можете даже использовать reduce (functools.reduce в Python 3):

Вы можете использовать аналогичный подход для обновления dict, но 1) вы должны использовать setdefault в случае, если часть индексного списка еще не указана в dict, и 2) вы должны удалить последний элемент из список и использовать это как обычный индекс для возвращаемый словарь.

>>> idx2 = ['test', 'testthree', 'four'] 
>>> reduce(lambda d, x: d.setdefault(x, {}), idx2[:-1], exampleDict)[idx2[-1]] = "foo" 
>>> exampleDict 
{'test': {'testthree': {'four': 'foo'}, 'testtwo': ['', '']}} 

В Python 3, вы могли бы сделать эту линию немного проще в использовании, используя кортеж-распаковка с *:

>>> *path, last = idx2 
>>> reduce(lambda d, x: d.setdefault(x, {}), path, exampleDict)[last] = "foo" 
+0

Это отлично работает, но как я могу обновить оригинальный словарь? –

+0

Большое спасибо @tobias_k, последний бит работает как шарм! –

2

Вы не можете использовать список для словарного ключа, потому что списки изменяемы, а изменяемые ключи не разрешены, но я думаю, что вы хотите использовать каждый элемент списка в качестве индекса. Без больше контекста, это не легко сказать, является ли это хорошая идея, без надлежащих проверок, но:

my_list = ['a', 'b'] 
my_dict[my_list[0]][my_list[1]] # access at ['a']['b'] 

У меня есть ощущение, что в зависимости от того проблема, которую вы хотите решить может быть решена по-другому.

+0

Нравится это, но количество ключей в 'my_list' меняется, поэтому я не могу ввести его вручную, как это было во второй строке. –

+0

@MattCowley Правильно, но я жестко закодировал список для примера. Вам нужно будет предварительно заполнить словарь во время сборки списка, поэтому ключевые обращения к словарю действительны. Я написал свой ответ, прежде чем предоставить дополнительную информацию. Ответ tobias_k выглядит хорошо для обновленных словарей. – synchronizer

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

  • Нет связанных вопросов^_^