将reduce lambda转换为list comprehension

时间:2015-11-14 19:42:21

标签: python list-comprehension python-2.x reduce

我按照这篇文章创建了一些函数,这些函数在给定密钥列表的情况下获取并将值设置为嵌套字典: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?

3 个答案:

答案 0 :(得分:3)

您的结果不是列表,因此无法进行列表推导。试试这个:

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

答案 1 :(得分:1)

我认为这样做的更多pythonic方法是使用原始问题中的显式循环。在此处查看此问题:Python alternative to reduce()

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

他建议做类似的事情:

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

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

答案 2 :(得分:0)

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

但是,如果您使用这种嵌套字典的字符串,JSON应该是最佳选择。见http://docs.python-guide.org/en/latest/scenarios/json/