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

时间:2014-03-27 19:30:15

标签: python list dictionary map functional-programming

我想将一个函数(称为 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

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

2 个答案:

答案 0 :(得分:2)

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个关键字参数的函数。

答案 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.