在python中使用数组作为索引

时间:2017-02-17 14:56:50

标签: python arrays indexing

所以我有一个类似['test', 'testtwo']的数组。

我希望能够将其用作字典的索引,如myDict['test']['testtwo']

这在python中可行吗?对不起,简短的解释。

编辑:

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

当在python中做一些事情时,我最终得到了数组['test', 'testtwo'],然后需要使用它来访问exampleDict['test']['testtwo']。键虽然发生了变化,但数组中的键数也会发生变化。

2 个答案:

答案 0 :(得分:2)

您不能使用列表作为字典键,因为列表是可变的,并且不允许使用可变键,但我认为您想要的是使用列表中的每个元素作为索引。没有更多的背景,如果没有经过适当的检查,这是不是一个好主意并不容易,但是:

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

我感觉你想要解决的问题可能会以不同的方式解决。

答案 1 :(得分:2)

您可以使用循环,迭代列表中的索引并更新"当前"当你去的时候:dict:

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

或者您甚至可以在Python 3中使用reducefunctools.reduce):

>>> reduce(lambda d, x: d[x], idx, exampleDict)
['', '']

您可以使用类似的方法更新dict,但1)如果索引列表的某些部分尚未出现在dict中,您应该使用setdefault,并且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"