繁体   English   中英

将函数应用于python中的字典列表

[英]Apply a function to a list of dictionaries in python

我想将一个函数(称为offline_optimize )应用于输入列表。 列表中的每个项目都是一个包含14个键值对的字典。 该列表由12个词典组成。

# This works
results = [offline_optimize(**input) for input in inputs]

# This doesn't
results = map(offline_optimize, *inputs)

TypeError:offline_optimize()只需要14个参数(给定12个)

输入是字典列表。 更确切地说,该列表由12个词典组成。

offline_optimize函数有14个参数。

当字典需要解压缩(使用双星语法**)到函数offline_optimize接受的14个参数时,如何在字典列表中使用map函数?

如果可能的话,我想避免列表推导。

map(function, sequence[, sequence, ...]) -> list

返回将函数应用于参数序列的项的结果列表。 如果给出了多个序列,则使用由每个序列的相应项组成的参数列表调用该函数,当不是所有序列具有相同长度时,将None替换为缺失值。 如果函数为None,则返回序列项的列表(如果有多个序列,则返回元组列表)。

我认为通过模拟inputsoffline_optimize可以最好地说明效果:

import string


inputs = [dict([(s, i) for i, s in enumerate(string.letters[:14])])] * 12

def offline_optimize(*args, **kwargs):
    return [("args", args),
            ("args_count", len(args)),
            ("kwargs", kwargs),
            ("kwargs_count", len(kwargs))]

inputs如下:

>>> print len(inputs), len(inputs[0]), inputs[0]
12 14 {'A': 0, 'C': 2, 'B': 1, 'E': 4, 'D': 3, 'G': 6, 'F': 5, 'I': 8, 'H': 7, 'K': 10, 'J': 9, 'M': 12, 'L': 11, 'N': 13}

你做这个:

>>> mapped = map(offline_optimize, *inputs)
>>> print len(mapped), mapped[0]
14 [('args', ('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A')), ('args_count', 12), ('kwargs', {}), ('kwargs_count', 0)]

你想这样做:

>>> mapped = map(lambda x: offline_optimize(**x), inputs)
>>> print len(mapped), mapped[0]

12 [('args', ()), ('args_count', 0), ('kwargs', {'A': 0, 'C': 2, 'B': 1, 'E': 4, 'D': 3, 'G': 6, 'F': 5, 'I': 8, 'H': 7, 'K': 10, 'J': 9, 'M': 12, 'L': 11, 'N': 13}), ('kwargs_count', 14)]

你真的想使用列表推导并避免使用14个关键字参数的函数。

基于您的错误,我假设offline_optimize()具有类似以下内容的函数签名:

def offline_optimize(arg1, arg2, maybe_arg3=some_default_value, ...):
    some_function(arg1)
    some_function(arg2, maybe_arg3)
    # etc.

将您的函数定义更改为:

def offline_optimize(**kwargs):
    some_function(kwargs.get('arg1'))
    some_function(kwargs.get('arg2'), kwargs.get('maybe_arg3', some_default_value))
    # etc.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM