Skip to main content
 首页 » 编程设计

python之从列表对象为字典创建键

2025年05月04日8pander-it

我有 list :

k = ["key1", "subkey2", "subsubkey3"] 

我确定 d 是一个字典,因此 d["key1"]["subkey2"]["subsubkey3"] 是有效的。

如何将列表 k 转换为字典 d 的键,以便返回 d[k[0]][k[1]]。 ..?

请您参考如下方法:

您可以尝试使用 reduce()与 operator.getitem :

>>> from operator import getitem 
>>>  
>>> d = {'key1': {'subkey2': {'subsubkey3': 'value'}}} 
>>> k = ["key1", "subkey2", "subsubkey3"] 
>>>  
>>> reduce(getitem, k, d) 
'value' 

在 Python 3.x 中,你应该使用 functools.reduce() .


reduce() 只是接受一个 2 参数函数并将其连续应用于列表的元素,累积结果。还有一个可选的 initializer 参数,我们在这里使用了它。正如文档所述,reduce() 大致等同于:

def reduce(function, iterable, initializer=None): 
    it = iter(iterable) 
    if initializer is None: 
        try: 
            initializer = next(it) 
        except StopIteration: 
            raise TypeError('reduce() of empty sequence with no initial value') 
    accum_value = initializer 
    for x in it: 
        accum_value = function(accum_value, x) 
    return accum_value 

在我们的例子中,我们传递了一个initializer,所以它不会是None。因此我们拥有的是:

def reduce(function, iterable, initializer=None): 
    it = iter(iterable) 
    accum_value = initializer 
    for x in it: 
        accum_value = function(accum_value, x) 
    return accum_value 

在这种情况下,我们的函数是getitem(a, b)(见上面的链接),它只返回a[b]。此外,我们的 iterable 是 k 而我们的 initializer 是 d。所以上面的 reduce() 调用等同于:

accum_value = d 
for x in k: 
    accum_value = accum_value[x]