I have the following setup: a function returns a dictionary with N timelines of equal size (100k points). The dictionary returns looks like:
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.
As you might have understood, the timelines (list of points) are not always stored in the same level. Sometimes I can access it with 1 key, sometimes with 2, sometimes with 5. Those keys will give me the labels for the plot and are necessary. My plan was to pass to the plot function a tuple of the keys.
Example:
T = ("Name1", "Name2", "b")
# Will allow me to access the timeline:
timelines["Name1"]["Name2"]["b"]
# by doing:
timelines[T[0]][T[1]][T[2]]
In the example above, I wrote the dictionary path myself ([T[0]][T[1]][T[2]]
), however how can I acess the right timeline with a tuple T of unknown size? How can I unpack the tuple into a dictionary path?
Thanks :)
I would actually do it like this, this will be the fastest method more than likely
from functools import reduce
from operator import getitem
path = ['Name1', 'Name2', 'a']
reduce(getitem, path, dictionary)
Lambda
calls can become expensive especially as data grows, not to mention getitem
will be faster than any other method listed here because it's implemented purely in C
You could use 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
The initial value is your timeline
dict. Reduce iterates on your T
tuple, and at each iteration, calls the lambda function. The lambda takes two arguments: the first one is the accumulated value, in this case the current dict d
, and the second one is the key it got from the tuple during this iteration. The lambda returns d[key]
, which becomes the new accumulated value for the next iteration.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With