列表理解以收集具有最内层键的嵌套字典项目

Posted

技术标签:

【中文标题】列表理解以收集具有最内层键的嵌套字典项目【英文标题】:List comprehension to collect a nested dict's items that have given innermost key 【发布时间】:2021-11-10 13:18:03 【问题描述】:

请假设给出以下字典

sources_targets = 
'front': 'source': [[0.021025050381526675, -0.39686011326197257, 3.328947963092819], [1.0601052368302668, -0.3938359761868055, 3.3247223740425893], [1.0543731204008824, -0.038184154352961984, 2.941639590795943], [0.017868184643970383, -0.0445863307249157, 2.9604912584916665]], 'target': [[-250.0, 0.0, 60.0], [-250.0, 0.0, -60.0], [-190.0, 0.0, -60.0], [-190.0, 0.0, 60.0]], 'left': 'source': [[-0.9522471062122733, -1.8444069007997075, 5.372044839796925], [-0.9665739520089994, -1.001259794819009, 5.0057689609608005], [0.9940538769534978, -1.851333804840362, 5.340677879647542], [0.9959517362506759, -1.0049420919111534, 4.942663843894899]], 'target': [[60.0, 0.0, 140.0], [60.0, 0.0, 80.0], [-60.0, 0.0, 140.0], [-60.0, 0.0, 80.0]], 'right': 'source': [[-0.8596841529333474, -3.0721166255322663, 4.182871479604773], [-0.8796404109762729, -2.117062488877432, 4.147040556143069], [1.0791152756424247, -2.0436646487085532, 4.08578012939533], [1.0951903113036177, -2.994375693306352, 4.124102127893507]], 'target': [[-60.0, 0.0, -140.0], [-60.0, 0.0, -80.0], [60.0, 0.0, -80.0], [60.0, 0.0, -140.0]], 'rear': 'source': [[0.08792816743383122, -0.5260295091566244, 3.0182522276468458], [0.9012540916522604, -0.5012267882763559, 3.0172622143554695], [0.8942115223224005, -0.15635208604951806, 2.6353057539009934], [0.08814313470840558, -0.18017837896764446, 2.6579174137231463]], 'target': [[250.0, 0.0, -40.0], [250.0, 0.0, 60.0], [190.0, 0.0, 60.0], [190.0, 0.0, -40.0]]

bundle_names = ['front', 'left', 'right', 'rear']

我想获取所有源的列表和所有目标的另一个列表。 此外,它需要在单行列表理解中完成。

我的成功尝试是


sources3d = [st[1] for name in self._bundle_names for st in sources_targets[name].items() if st[0] == "source"]
targets3d = [st[1] for name in self._bundle_names for st in sources_targets[name].items() if st[0] == "target"]

具有正确的输出(例如“来源”)

[[[0.021025050381526675, -0.39686011326197257, 3.328947963092819], [1.0601052368302668, -0.3938359761868055, 3.3247223740425893], [1.0543731204008824, -0.038184154352961984, 2.941639590795943], [0.017868184643970383, -0.0445863307249157, 2.9604912584916665]], [[-0.9522471062122733, -1.8444069007997075, 5.372044839796925], [-0.9665739520089994, -1.001259794819009, 5.0057689609608005], [0.9940538769534978, -1.851333804840362, 5.340677879647542], [0.9959517362506759, -1.0049420919111534, 4.942663843894899]], [[-0.8596841529333474, -3.0721166255322663, 4.182871479604773], [-0.8796404109762729, -2.117062488877432, 4.147040556143069], [1.0791152756424247, -2.0436646487085532, 4.08578012939533], [1.0951903113036177, -2.994375693306352, 4.124102127893507]], [[0.08792816743383122, -0.5260295091566244, 3.0182522276468458], [0.9012540916522604, -0.5012267882763559, 3.0172622143554695], [0.8942115223224005, -0.15635208604951806, 2.6353057539009934], [0.08814313470840558, -0.18017837896764446, 2.6579174137231463]]]

我使用.items() 访问内部字典并通过索引访问元组的方式似乎很麻烦。

我想通过某种方式访问​​

[st["source"] for name in self._bundle_names for st in sources_targets[name]] 

这不起作用,但会更干净。

我确信有办法正确地做到这一点。

【问题讨论】:

需要使用推导式吗?这需要你循环两次字典 我在哪里循环两次? 一次用于源,一次用于目标 试试,[v['source'] for k, v in sources_targets.items()] ? @sushanth 不起作用,试试看。 .items 返回元组,如果像我所做的那样,必须对其进行检查。 【参考方案1】:

您迭代所有 items,然后选择具有所需键的一个 (!) 项目。相反,直接访问密钥。 这应该有效,产生的结果等于您的sources3dtargets3d

sources3d = [sources_targets[name]["source"] for name in bundle_names]
targets3d = [sources_targets[name]["target"] for name in bundle_names]

如果您需要多个项目,您基本上可以这样做,但也可以遍历您想要获取的键/项目列表:

>>> items = ["source", "target"]                                                                                                                                        
>>> [sources_targets[name][item] for name in bundle_names for item in items]

【讨论】:

以上是关于列表理解以收集具有最内层键的嵌套字典项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同长度的列表列表中删除最内层的嵌套

具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?

使用列表中的项目更改嵌套字典的字典中的值?

Python:带有字符串列表和子字典的嵌套字典

字典列表中的列表理解[重复]

在列表中查找具有值的最小字典键的 Pythonic 方法?