将reduce lambda转换为列表理解

2024-09-28 21:11:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我跟随这篇文章创建函数,这些函数在给定键列表的情况下获取并设置嵌套字典中的值: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

在避免reduce的情况下,如何使用列表理解或其他方法以pythonic(2.x)的方式实现呢?在


Tags: of函数reduce列表valuedefwith情况
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

我认为更具Python式的方法是使用一个显式循环,就像你在最初的问题中所做的那样。请看这里的问题:Python alternative to reduce()

根据链接的答案: Guido建议不要使用reduce(),并解释了为什么在python3.x的链接blog post中将其移动到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

因为事情更清楚了。在

你已经做的很好。您将无法做得更好,因为reduce基本上是用一个累加器遍历某个内容,而basic list comprehension则在没有任何累加器的情况下迭代某些内容。在

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

相关问题 更多 >