在Python中对数组的所有dict元素应用函数

to94eoyn  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(107)

你好,我想知道什么是最好的方法来应用一个函数的所有元素的数组(这些元素是字典)。我有一个包含元素的dict对象,其中一个是另一个dict数组。我想避免做以下事情

my_array = api.get_elements().json() # return an array of dict
for elem in my_array:
    for sub_elem in elem['sub_array']: # here I access the the sub array
        process(sub_elem)

process将是一个函数,我修改了我的sub_elem的一些值。根据我目前所读到的,我可以像这样使用map()函数,

map_res = map(process, elem['sub_array'])

或者我可以使用列表理解

res = [process(sub_elem) for sub_elem in elem['sub_array']]

然后有人告诉我,我也可以使用generator,因为他告诉我,在处理大数据时,它对内存更好。问题是他没告诉我怎么做所以我尝试了我的方式:

processed_data_generator = (process(d) for d in elem['sub_array'])

def process(elem: dict):
    elem['name'] = 'NAME'

for processed_dict in processed_data_generator:
    print(processed_dict)

但是我不确定我必须退货吗?卖出收益表?因为我现在找不到一种方法来访问生成器的结果,而且看起来我的代码除了“初始化”生成器对象之外没有做任何事情。
如何正确处理我的问题?

hgqdbh6s

hgqdbh6s1#

我认为它可以通过递归函数调用来解决,如下面的实现。代码基于Python 3。

import collections.abc

def map_nested_dicts_modify(ob, func):
    for k, v in ob.items():
        if isinstance(v, collections.abc.Mapping):
            map_nested_dicts_modify(v, func)
        else:
            func(v)

map_nested_dicts_modify(my_array, process)
zujrkrfu

zujrkrfu2#

你说对了:
首先检查你的函数返回了什么。你需要一个return关键字来从你的函数中返回一些东西。像

def process(elem: dict):
    return elem['name'] = 'NAME'  # you are assigning 'NAME' value to 'name' key in elem dictionary.

一旦你正确理解了你的函数,你就可以跳到生成器。

processed_data_generator = (process(d) for d in elem['sub_array'])  # you are applying function process on each item(d) in elem['sub_array']

如果您想一次性查看完整的生成器,您可以:

list(processed_data_generator)

想看单个元素:

for processed_dict in processed_data_generator:
    print(processed_dict)

相关问题