将 reduce lambda 转换为列表理解

Convert reduce lambda to list comprehension

我按照这个 post 创建函数,在给定键列表的情况下将值获取和设置到嵌套字典中:Access nested dictionary items via a list of keys?

# get a dict value with a list of nested keys
def getFromDict(dataDict, mapList):
    return reduce(lambda d, k: d[k], mapList, dataDict)


# set a dict value with a list of nested keys
def setInDict(dataDict, mapList, value):
    getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value

如何使用列表理解或其他方式以 Python 方式 (2.x) 完成此操作,同时避免 reduce?

您的结果不是列表,因此无法理解列表。试试这个:

def get_from_dict(data, keys):
    for key in keys:
        data = data[key]
    return data

def set_in_dict(data, keys, value):
    get_from_dict(data, keys[:-1])[keys[-1]] = value

我认为更 pythonic 的方法是使用显式循环,就像您在原始问题中所做的那样。在这里查看这个问题:Python alternative to reduce()

来自链接的答案: Guido 建议不要使用 reduce() 并解释了为什么它被移动到 functools in python 3.x in the linked blog post.

他反而建议做类似的事情:

def get_from_dict(data_dict, map_list):
    for key in map_list:
        data_dict = data_dict[key]
    return data_dict

def set_in_dict(data_dict, map_list, value):
    data_dict = get_from_dict(data_dict, map_list[:-1])
    data_dict[map_list[-1]] = value

因为它更清楚发生了什么。

你已经做的很好。您将无法做得更好,因为 reduce 基本上使用 累加器 迭代某些内容,而基本列表理解在没有任何累加器的情况下迭代某些内容。

但是,如果您对此类嵌套词典进行字符串使用,JSON 应该是可行的方法。参见 http://docs.python-guide.org/en/latest/scenarios/json/