通过variab访问嵌套字典

2024-05-14 23:08:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下设置:一个函数返回一个具有N个大小相等的时间线(100k点)的字典。字典返回的结果如下所示:

timelines = dict()
timelines["Name1"] = dict()
timelines["Name1"]["Name2"] = dict()
timelines["Name1"]["Name3"] = dict()
timelines["Name1"]["Name2"]["a"] = # List of 100k points
timelines["Name1"]["Name2"]["b"] = # List of 100k points
timelines["Name1"]["Name2"]["c"] = # List of 100k points
timelines["Name1"]["Name3"]["b"] = # List of 100k points
timelines["Name1"]["Name2"]["c"] = # List of 100k points
timelines["Name1"]["a"] = # List of 100k points
timelines["Name1"]["b"] = # List of 100k points
timelines["Name2"] # and so on.

如您所知,时间线(点列表)并不总是存储在同一级别中。有时我可以用1键,有时用2键,有时用5键。 这些键将给我的绘图标签,是必要的。我的计划是把一组键传递给plot函数。你知道吗

示例:

T = ("Name1", "Name2", "b") 
# Will allow me to access the timeline:
timelines["Name1"]["Name2"]["b"]
# by doing:
timelines[T[0]][T[1]][T[2]]

在上面的例子中,我自己编写了dictionary路径([T[0]][T[1]][T[2]]),但是如何使用大小未知的元组T访问正确的时间轴呢?如何将元组解压到字典路径中?你知道吗

谢谢:)


Tags: andof函数路径字典so时间dict
3条回答

我真的会这样做,这将是最快的方法比可能

from functools import reduce
from operator import getitem

path = ['Name1', 'Name2', 'a']

reduce(getitem, path, dictionary)

Lambda调用会变得非常昂贵,尤其是随着数据的增长,getitem会比这里列出的任何其他方法都要快,因为它完全是在C中实现的

可以使用递归方法

def access_my_dict(my_dict, tuple_keys):
    value = my_dict[tuple_keys[0]]
    if isinstance(value, dict):
        return access_my_dict(value, tuple_keys[0:])
    return value

你可以用reduce

from functools import reduce

timelines = dict()
timelines["Name1"] = dict()
timelines["Name1"]["Name2"] = dict()
timelines["Name1"]["Name2"]["b"] = 'my data'

T = ("Name1", "Name2", "b") 

data = reduce(lambda d, key: d[key], T, timelines)

print(data)
# my data

初始值是timelinedict.Reduce对T元组进行迭代,并在每次迭代时调用lambda函数。lambda有两个参数:第一个参数是累积值,在本例中是当前dictd,第二个参数是它在这个迭代过程中从元组得到的键。lambda返回d[key],它成为下一次迭代的新累积值。你知道吗

相关问题 更多 >

    热门问题