【问题标题】:list indices must be integers python nested dictionaries列表索引必须是整数 python 嵌套字典
【发布时间】:2013-07-06 12:51:57
【问题描述】:

在 python 3 中,我需要一个从嵌套键中动态返回值的函数。

nesteddict = {'a':'a1','b':'b1','c':{'cn':'cn1'}}
print(nesteddict['c']['cn']) #gives cn1

def nestedvalueget(keys):
    print(nesteddict[keys])

nestedvalueget(['n']['cn'])

nestedvalueget应该怎么写?

我不确定标题的措辞是否正确,但我不确定如何最好地描述这一点。

【问题讨论】:

    标签: python dictionary python-3.x


    【解决方案1】:

    如果要遍历字典,使用循环:

    def nestedvalueget(*keys):
        ob = nesteddict
        for key in keys:
            ob = ob[key]
        return ob
    

    或使用functools.reduce():

    from functools import reduce
    from operator import getitem
    
    def nestedvalueget(*keys):
        return reduce(getitem, keys, nesteddict)
    

    然后将任一版本用作:

    nestedvalueget('c', 'cn')
    

    请注意,任何一个版本都采用可变数量的参数来让您传递 0 个或多个键作为位置参数。

    演示:

    >>> nesteddict = {'a':'a1','b':'b1','c':{'cn':'cn1'}}
    >>> def nestedvalueget(*keys):
    ...     ob = nesteddict
    ...     for key in keys:
    ...         ob = ob[key]
    ...     return ob
    ... 
    >>> nestedvalueget('c', 'cn')
    'cn1'
    >>> from functools import reduce
    >>> from operator import getitem
    >>> def nestedvalueget(*keys):
    ...     return reduce(getitem, keys, nesteddict)
    ... 
    >>> nestedvalueget('c', 'cn')
    'cn1'
    

    为了澄清您的错误消息:您将表达式 ['n']['cn'] 传递给您的函数调用,该函数定义了一个包含一个元素 (['n']) 的列表,然后您尝试使用字符串 'cn' 对其进行索引。列表索引只能是整数:

    >>> ['n']['cn']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: list indices must be integers, not str
    >>> ['n'][0]
    'n'
    

    【讨论】:

    • functools.reduce() 是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2017-04-12
    • 2016-09-19
    相关资源
    最近更新 更多