【问题标题】:Access deeper-level list items inside nested dictionaries?访问嵌套字典中的更深层次的列表项?
【发布时间】:2020-09-04 07:55:15
【问题描述】:

我有一个由嵌套字典和列表组成的数据结构..

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 级字典中的键,IonX 在 lvl2 中,IonX(第二个实例)在 lvl3 中,然后我们有一个包含某些值的列表类型对象我想在函数中使用。

现在,如果这些都是列表,并且我想将所有值用于某个 IonX-IonX 组合(按此顺序),我可以使用function(data[:][:]["Ion1"]["Ion2"]) 对其进行切片吗?

无论哪种方式,我现在都搜索了很长一段时间,但找不到真正解决相同问题的问题...

如何最好地使用我的字典结构?

迭代每个字典中的所有键直到达到所需级别并将所有值列表(如果存在)返回到新字典/列表中是否是个好主意? 那是最简单、最优雅甚至最 Pythonic 的方式吗?我真的不敢相信这是..

我现在真的不知道如何使用列表理解来实现我的目标,但我想我可以想出一些办法,尽管结果可能会很丑。

我几乎没有使用生成器和yield 的经验,尽管它似乎可以提供帮助。如果您建议这种方法,我会请您更详细地解释。

提前谢谢大家。希望你们能在这里帮助我。真的卡住了。

干杯,BUFU

【问题讨论】:

  • 出于好奇,所有“值列表”的大小都相同吗?这可能是使用pandas 的好地方。
  • 代码中是否还有其他地方 System -> Charge -> Ion 层次结构很重要?您可以重塑您的数据(或复制它并重塑副本)以使离子成为主键。
  • @0x5453 不,很遗憾没有。但感谢您的链接。将检查这些 DataFrames。
  • 用于重塑数据:它会在工作流的不同部分导致相同的问题.. 交换功能...

标签: python dictionary slice


【解决方案1】:

这是一种遍历值列表并将其打印出来的方法,但正如 cmets 中的 @ 0x5453 所建议的那样,pandas 在速度和可读性方面可能更有效..

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)

【讨论】:

  • @BUFU 告诉我您的功能要实现的目标,我也会将其纳入我的回答尝试中。
  • 嘿古斯塔夫!这基本上是我大部分时间都在做的事情,当我遍历所有内容时......我只是希望有一种更简单的方法可以只将整个树的一部分交给函数(我不需要所有值) .. 我想我写了一个辅助函数来遍历所有内容,整理出我需要的那些并只返回那些,所以我基本上可以“过滤”出我需要的东西并做类似function(filterfunc(data, i1="Ion1", i2="Ion3"))的事情。该函数为每个系统/电荷组合生成一个直方图。 (还有其他的东西可能会在以后。)
  • 哦,我应该澄清一下,我有两个级别的“离子”实际上具有相同的键,但顺序很重要,并且在解决方案方面可能会使问题更加复杂......尽管使用这种方法没关系。
  • 如何将 lambda 应用于过滤函数?类似于 list(filter(lambda i1, i2: i1 == "Ion1" and i2 == "Ion3", ion_list))
  • 这可能是一个很好的答案。当我有一个可行的解决方案时,我会尝试并回来。
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多