[英]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,则返回序列项的列表(如果有多个序列,则返回元组列表)。
我认为通过模拟inputs
和offline_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.