所以我有一个类似['test', 'testtwo']
的数组。
我希望能够将其用作字典的索引,如myDict['test']['testtwo']
。
这在python中可行吗?对不起,简短的解释。
编辑:
exampleDict = {
'test': {
'testtwo': [
'',
''
]
}
}
当在python中做一些事情时,我最终得到了数组['test', 'testtwo']
,然后需要使用它来访问exampleDict['test']['testtwo']
。键虽然发生了变化,但数组中的键数也会发生变化。
答案 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中使用reduce
(functools.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"