我有一个由嵌套字典和列表组成的数据结构。
System1 -- Charge1 -- Ion1 -- Ion2 -- List of Values
-- Charge2 -- Ion1 -- Ion2 -- List of Values
-- Charge2 -- Ion2 -- Ion4 -- List of Values
-- Charge2 -- Ion3 -- Ion4 -- List of Values
System2 -- Charge1 -- Ion1 -- Ion2 -- List of Values
... and so on
SystemX是最高级别(级别0)字典中的键,ChargeX是级别1字典中的键,lvl2中的IonX,lvl3中的IonX(第二实例),然后我们有一个保存某些值的列表类型对象我想在函数中使用。
现在,如果这些都是列表,并且我想将所有值用于某个IonX-IonX组合(按该顺序),我可以用function(data[:][:]["Ion1"]["Ion2"])
对其进行切片吗?
无论哪种方式,我现在搜索了很长时间,但并没有真正找到我认为可以解决同一问题的问题...
如何最好地使用字典结构?
一个好主意是遍历每个字典中的所有键,直到达到所需的级别,然后将所有值列表返回(如果存在)到新的字典/列表中? 这是最简单,最优雅,甚至最pythonic的方式吗?我真的不敢相信。.
我现在真的不知道如何使用列表理解来实现我的目标,但是我想我可以弄清楚一些东西,尽管结果可能很难看。
我实际上没有使用生成器和yield
的经验,尽管似乎可以帮上忙。如果您建议采用这种方法,请您详细解释。
提前谢谢大家。希望你们能在这里帮助我。真的卡住了。
干杯,BUFU
答案 0 :(得分:0)
这是一种循环遍历值列表并打印出来的方法,但是熊猫在速度和可读性方面可能更有效,如@ 0x5453在评论中建议的那样。
data = {
"System1": {"Charge1": {"Ion1": [1, 2, 3, 4, 5],
"Ion2": [6, 7, 8, 9, 10]
},
"Charge2": {"Ion1": [11, 12, 13, 14, 15],
"Ion2": [16,17, 18, 19, 20]
},
},
"System2": {"Charge1": {"Ion1": [1, 2, 3, 4, 5],
"Ion2": [6, 7, 8, 9, 10]
},
"Charge2": {"Ion1": [11, 12, 13, 14, 15],
"Ion2": [16,17, 18, 19, 20]
}
}
}
def simple_function(data):
for systems in data.keys():
for charges in data[str(systems)]:
for ions in data[str(systems)][str(charges)]:
for value_lists in data[str(systems)][str(charges)][str(ions)]:
print(f"{value_lists = }")
simple_function(data)