将多个列表映射到字典

3
我是一位有帮助的助手,可以为您进行翻译。以下是您需要翻译的内容:

我有5个列表,想将它们映射到一个分层字典中。

假设我有:

temp = [25, 25, 25, 25]
volt = [3.8,3.8,3.8,3.8]
chan = [1,1,6,6]
rate = [12,14,12,14]
power = [13.2,15.3,13.8,15.1]

「而我想要的字典是这个:」
{25:{3.8:{1:{12:13.2,14:15.3},6:{12:13.8,14:15.1}}}}

基本上,这个字典的结构是:
{temp:{volt:{chan:{rate:power}}}}

我尝试使用zip函数,但由于顶层列表中存在重复值,因此在这种情况下无法帮助。


你如何处理重复的值? - Blender
我只是想在示例中保持列表的简洁,但我的数据将包括例如:temp = [25,25,....,25,60,60,.....,60,75,75,...]我之所以有这些重复值,是因为功率值对应于该温度值...一旦映射到字典中,我就不再需要该列表。 - emad
根据索引确定。例如,当索引为2时,temp = 25,volt = 3.8,chan = 1,rate = 14,power = 15.3。 - emad
2个回答

8

这只是经过轻微测试,但似乎能解决问题。基本上,f 的作用是创建一个 defaultdict 的嵌套字典。

f = lambda: collections.defaultdict(f)
d = f()
for i in range(len(temp)):
    d[temp[i]][volt[i]][chan[i]][rate[i]] = power[i]

例子:

>>> print d[25][3.8][6][14]
15.1

(这个想法借鉴自相关问题的答案。)

我喜欢称之为“infinitedict = lambda: collections.defaultdict(infinitedict)” - jterrace
@jterrace 是的,实际上是你的一个回答给了我灵感。希望你不介意。 - tobias_k

2
您可以尝试以下方法...我相信它能满足您的需求。
>>> # Given your sample data.
>>> ans = {}
>>> for (t, v, c, r, p) in zip(temp, volt, chan, rate, power):
...     if not t in ans:
...             ans[t] = {}
...     if not v in ans[t]:
...             ans[t][v] = {}
...     if not c in ans[t][v]:
...             ans[t][v][c] = {}
...     if not r in ans[t][v][c]:
...             ans[t][v][c][r] = p
>>> print ans
{25: {3.8: {1: {12: 13.2, 14: 15.3}, 6: {12: 13.8, 14: 15.1}}}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接