【问题标题】:using a single variable to index into nested dictionaries使用单个变量索引嵌套字典
【发布时间】:2012-12-13 04:20:20
【问题描述】:

假设你有一本 Python 字典:myDic = {'a':1, 'b':{'c':2, 'd':3}}。您当然可以将变量设置为键值并在以后使用它,例如:

myKey = 'b'
myDic[myKey]
>>> {'c':2, 'd':3}

但是,有没有办法以某种方式将变量设置为一个值,当用作键时,该值也会挖掘到子字典中?有没有办法在python中完成以下伪代码?

myKey = "['b']['c']"
myDic[myKey]
>>> 2

所以首先它使用“b”作为键,然后再使用“c”作为键。显然,如果第一次查找返回的值不是字典,就会返回错误。

【问题讨论】:

标签: python dictionary


【解决方案1】:

不,您不能将任何内容放入变量中,以便 myDict[myKey] 挖掘嵌套字典。

这里有一个功能可能对您有用:

def recursive_get(d, keys):
    if len(keys) == 1:
        return d[keys[0]]
    return recursive_get(d[keys[0]], keys[1:])

例子:

>>> myDic = {'a':1, 'b':{'c':2, 'd':3}}
>>> recursive_get(myDic, ['b', 'c'])
2

【讨论】:

  • 好的,我最初考虑只实现您在此处显示的递归方法,但一直在等待是否有内置的东西来完成这项工作,因为我也想要这种嵌套功能设置值并检查是否nested_key in dic。但由于似乎没有替代方案,我将接受这个答案并手动实现任何其他功能。
【解决方案2】:

不,不是普通的字典。使用myDict[key],您只能访问实际上是myDict 值的值。但是如果myDict包含其他dicts,那些嵌套dicts的值就不是myDict的值。

根据您对数据结构所做的操作,可以通过使用元组键而不是嵌套字典来获得您想要的结果。您可以使用myDic = {('b', 'c'):2, ('b', 'd'): 3},而不是myDic = {'b':{'c':2, 'd':3}}。然后您可以使用myDic['b', 'c'] 之类的方式访问这些值。你确实可以这样做:

val = 'b', 'c'
myDic[val]

【讨论】:

    【解决方案3】:

    AFAIK,你不能。如果您考虑 python 的工作方式,它会从内到外从左到右进行评估。在这种情况下,[]__getitem__ 的简写。因此,您需要解析您传递给__getitem__ 的参数(无论您传递什么)并智能地处理它。如果你想有这样的行为,你需要继承/编写你自己的 dict 类。

    【讨论】:

    • 啊,现在我明白为什么我不能这样做了。谢谢你的解释。
    【解决方案4】:
    myDict = {'a':1, 'b':{'c':2, 'd':3}}
    k = 'b'
    
    myDict.get(k) should give
    {'c':2, 'd':3}
    
    and either
    d.get(k)['c'] 
    OR
    
    k1 = 'c'
    d.get(k).key(k1) should give 2
    

    【讨论】:

      【解决方案5】:

      相当老的问题。没有内置函数。

      使用functools.reduceoperator.getitem 的紧凑型解决方案:

      from functools import reduce
      from operator import getitem
      
      d = {'a': {'b': ['banana', 'lemon']}}
      p = ['a', 'b', 1]
      
      v = reduce(getitem, p, d)
      # 'lemon'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-08
        • 2021-11-09
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 2022-07-01
        相关资源
        最近更新 更多