我想将一个函数(称为 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个参数。
如果需要将字典解压缩(使用双星语法**)到函数接受的14个参数,我如何在字典列表中使用 map 函数 offline_optimize
如果可能,我想避免列表推导。
答案 0 :(得分:2)
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个关键字参数的函数。
答案 1 :(得分:0)
根据您的错误,我假设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.