【问题标题】:How to return nested dictionary from function如何从函数返回嵌套字典
【发布时间】:2020-08-06 08:18:33
【问题描述】:

是否可以根据参数创建一个返回嵌套字典的函数?

def foo(key):
    d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}, }
    return d[key]

foo(['c']['d']) 

我在等待:

3

我明白了:

TypeError: list indices must be integers or slices, not str

我了解可以返回整个字典,或对其进行硬编码以返回字典的特定部分,例如

if 'c' and 'd' in kwargs:
    return d['c']['d']
elif 'c' and 'e' in kwargs:
        return d['c']['e']

但是会很不灵活

【问题讨论】:

标签: python


【解决方案1】:

一种可能的解决方案是遍历多个键 -

def foo(keys, d=None):
    if d is None:
        d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}, }
    if len(keys) == 1:
        return d[keys[0]]
    return foo(keys[1:], d[keys[0]])

foo(['c', 'd']) 

【讨论】:

  • 这是一种极其错误的字典复制方式
  • 我实际上并不想复制字典,但这给了我一个修复的想法
  • 如果字典更嵌套,此代码也不起作用
【解决方案2】:

当您提供['c']['d'] 时,您使用字母d 分割列表['c'],这是不可能的。所以你可以做的是,纠正切片:

foo('c')['d']

或者你可以改变你的函数来分割它:

def foo(*args):
    d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}, }
    d_old = dict(d) # if case you have to store the dict for other operations in the fucntion
    for i in args:
        d = d[i]
    return d
>>> foo('c','d')
3

【讨论】:

    【解决方案3】:
    d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}, }
    def funt(keys):
      val = d
      for key in keys:
        if val:
          val = val.get(key)
      return val
    
    funt(['c', 'd'])
    

    另外处理键不存在的状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2019-01-12
      • 2020-02-22
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多