2014-03-27 38 views
0

我想一個函數(稱爲offline_optimize)適用於輸入列表。列表中的每個項目都是一個包含14個鍵值對的字典。該列表包含12個字典。應用的功能,詞典列表在python

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

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

TypeError: offline_optimize() takes exactly 14 arguments (12 given)

輸入是字典的列表。更確切地說,該列表包含12個字典。

功能offline_optimize需要14個參數。

我如何使用地圖功能的詞典列表上,當字典需要解壓(使用雙星語法**),以14個參數由功能offline_optimize被接受?

我想避免列表理解,如果可能的話。

+0

變化offline_optimize'的'函數簽名,以便它接受可變數量的關鍵字參數。 –

+0

@JoelCornett:你能舉一個簡單的例子嗎? –

回答

2

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

返回將函數應用於參數序列 的結果列表。 如果多於一個序列被給出時, 函數被調用用由每個序列的相應 項的參數列表中,當不是所有 序列具有相同的長度缺失的值代無。如果函數是無,返回的序列(或如果超過一個序列的元組的列表)的 的項目清單。

我覺得效果是最好的嘲諷了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個關鍵字參數的函數。

+0

謝謝,''地圖(lambda x:offline_optimize(** x),輸入)''訣竅。 –

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. 
+0

感謝您的想法。我不知道'get'函數,特別是與'some_default_value'結合使用。儘管如此,@SimonPantzare的匿名函數完成了這項工作。 –