2017-07-29 8 views
1

私はfunction_iterate_over_arrayという以下の関数を持っています。この関数は、配列と関数名のリストを取ります。関数は機能しますが、同じ結果を達成する関数を作成する必要がありますが、任意の数のfunction_namesを取り込むことができます。配列内のアイテム内の任意の数の関数に対して反復処理を行う関数を作成するにはどうすればよいですか?

例えば、以下の機能が、私は任意の数の機能を取ることができfunction_iterate_over_arrayよりも優れた機能と同じ結果を達成したい4人のファンクション名

from operator import itemgetter 
from itertools import groupby 
from dictionary_functions import DictionaryFunctions 

group_func = lambda iterable,key: [list(group) for key, group in groupby(sorted(iterable, key=itemgetter(key)), itemgetter(key))] 

def add_one(i): 
    return i + 1 
def subtract_one(i): 
    return i - 1 


array = [{'f1':add_one,'f2':add_one,'f3':add_one,'f4':add_one}, 
{'f1':add_one,'f2':add_one,'f3':add_one,'f4':add_one}, 
{'f1':subtract_one,'f2':subtract_one,'f3':subtract_one,'f4':subtract_one}, 
{'f1':subtract_one,'f2':add_one,'f3':add_one,'f4':add_one}] 

functions = ['f1','f2','f3','f4'] 

def function_iterate_over_array(array,functions,starting_value=0): 
    L = [] 
    function_key_name = functions[0] 
    grouped_array = group_func(array,function_key_name) 
    for grouped_array_item in grouped_array: 
     function_one = grouped_array_item[0][function_key_name] 
     function_one_result = function_one(starting_value) 

     function_two_name = functions[1] 
     sub_grouped_array = group_func(grouped_array_item,function_two_name) 
     for sub_grouped_array_item in sub_grouped_array: 
      function_two = sub_grouped_array_item[0][function_two_name] 
      function_two_result = function_two(function_one_result) 


      function_three_name = functions[2] 
      sub_sub_grouped_array = group_func(sub_grouped_array_item,function_three_name) 
      for sub_sub_grouped_array_item in sub_sub_grouped_array: 
       function_three = sub_sub_grouped_array_item[0][function_three_name] 
       function_three_result = function_three(function_two_result) 


       function_four_name = functions[3] 
       sub_sub_sub_grouped_array = group_func(sub_sub_grouped_array_item,function_four_name) 
       for sub_sub_sub_grouped_array_item in sub_sub_sub_grouped_array: 
        function_four = sub_sub_sub_grouped_array_item[0][function_four_name] 
        function_four_result = function_four(function_three_result) 


        for dictionary_from_array in sub_sub_sub_grouped_array_item: 
         D = dict(dictionary_from_array.items()+{'result':function_four_result}.items()) 
         L.append(D) 

    return L 



L = function_iterate_over_array(array,functions) 
#-->[{'f1': <function add_one at 0x1006d5cf8>, 'f2': <function add_one at 0x1006d5cf8>, 'f3': <function add_one at 0x1006d5cf8>, 'f4': <function add_one at 0x1006d5cf8>, 'result': 4}, {'f1': <function add_one at 0x1006d5cf8>, 'f2': <function add_one at 0x1006d5cf8>, 'f3': <function add_one at 0x1006d5cf8>, 'f4': <function add_one at 0x1006d5cf8>, 'result': 4}, {'f1': <function subtract_one at 0x100763ed8>, 'f2': <function add_one at 0x1006d5cf8>, 'f3': <function add_one at 0x1006d5cf8>, 'f4': <function add_one at 0x1006d5cf8>, 'result': 2}, {'f1': <function subtract_one at 0x100763ed8>, 'f2': <function subtract_one at 0x100763ed8>, 'f3': <function subtract_one at 0x100763ed8>, 'f4': <function subtract_one at 0x100763ed8>, 'result': -4}] 

に取る必要があります。例えば、私は仕事に次のようにしたい:

array = [{'f1':add_one,'f2':add_one,'f3':add_one,'f4':add_one}, 
{'f1':add_one,'f2':add_one,'f3':add_one,'f4':add_one}, 
{'f1':subtract_one,'f2':subtract_one,'f3':subtract_one,'f4':subtract_one}, 
{'f1':subtract_one,'f2':add_one,'f3':add_one,'f4':add_one}] 
function_iterate_over_array(array,['f1','f2']) 

function_iterate_over_array(配列、[ 'F1'、 'f2は'])以下を返す必要があります:

私は変更することによって達成
[{'f1': <function add_one at 0x101a0fcf8>, 'f2': <function add_one at 0x101a0fcf8>, 'f3': <function add_one at 0x101a0fcf8>, 'f4': <function add_one at 0x101a0fcf8>, 'f5': <function add_one at 0x101a0fcf8>, 'result': 2}, {'f1': <function add_one at 0x101a0fcf8>, 'f2': <function add_one at 0x101a0fcf8>, 'f3': <function add_one at 0x101a0fcf8>, 'f4': <function add_one at 0x101a0fcf8>, 'f5': <function add_one at 0x101a0fcf8>, 'result': 2}] 

次へfunction_iterate_over_array:

def function_iterate_over_array(array,functions,starting_value=0): 
    L = [] 
    function_key_name = functions[0] 
    grouped_array = group_func(array,function_key_name) 
    for grouped_array_item in grouped_array: 
     function_one = grouped_array_item[0][function_key_name] 
     function_one_result = function_one(starting_value) 

     function_two_name = functions[1] 
     sub_grouped_array = group_func(grouped_array_item,function_two_name) 
     for sub_grouped_array_item in sub_grouped_array: 
      function_two = sub_grouped_array_item[0][function_two_name] 
      function_two_result = function_two(function_one_result) 


      for dictionary_from_array in sub_grouped_array_item: 
       D = dict(dictionary_from_array.items()+{'result':function_two_result}.items()) 
       L.append(D) 
    return L 

私も次のよう

array = [{'f1':add_one,'f2':add_one,'f3':add_one,'f4':add_one,'f5':add_one}, 
{'f1':add_one,'f2':add_one,'f3':add_one,'f4':add_one,'f5':add_one}] 
functions = ['f1','f2','f3','f4','f5'] 
function_iterate_over_array(array,functions) 
0123を動作するようにしたいです

特に私は上記の関数を書くことにより、任意の数の関数を使うことができるようにするより良い方法を探しています。

+1

これらの関数では何を達成したいですか? 'function_iterate_over_array(array、['f1'、 'f2'])の出力はどうすればよいですか? –

+0

良い点 - これらの詳細を追加するために私の質問を更新しました。 – Chris

+0

概念的には、この関数の目的は何ですか? – Quelklef

答えて

3

reduceのように見えます。

単一の値に反復可能を低減するように、左から右へ 、反復可能な項目に累積的に二つの引数の関数を適用します。 たとえば、reduce(lambda x、y:x + y、[1,2,3,4,5])は ((((1 + 2)+3)+4)+5)を計算します。左の引数xは累積された値で、 右の引数yは反復可能な値からの更新値です。 オプションのイニシャライザが存在する場合は、計算でiterableの の項目の前に配置され、iterable が空の場合はデフォルトとして機能します。イニシャライザが指定されておらず、iterableに1つだけの アイテムが含まれている場合、最初のアイテムが返されます。

これは、値のコレクションに何度も何度も繰り返し機能を適用するように特別に設計されています。 lambdaを使用すると、各ステップで異なる機能を使用できます。

from functools import reduce 

def add_one(i): 
    return i + 1 

def subtract_one(i): 
    return i - 1 

function_dicts = [{'f1':add_one,'f2':add_one,'f3':add_one,'f4':add_one}, 
{'f1':subtract_one,'f2':subtract_one,'f3':subtract_one,'f4':subtract_one}, 
{'f1':subtract_one,'f2':add_one,'f3':add_one,'f4':add_one}] 

functions = ['f1','f2','f3','f4'] 

for function_dict in function_dicts: 
    result = reduce((lambda value, fname : function_dict[fname](value)), functions, 0) 
    print(result) 
# 4 
# -4 
# 2 

これは、あなたの質問とまったく同じ形式を返しませんが、これは望ましいコア機能を提供します。

2

これはかなり近いですが、注文は異なります。私は、その種のことをやっていたはずがなかった。それを復元するのに手助けが必要な場合は、そこの目標を説明してください。 (関数はソートできないので、Python 3ではソートは機能しません)。

import pprint 

def add_one(i): 
    return i + 1 
def subtract_one(i): 
    return i - 1 

function_dictionaries = [ 
    {'f1': add_one, 'f2': add_one, 'f3': add_one, 'f4': add_one}, 
    {'f1': add_one, 'f2': add_one, 'f3': add_one, 'f4': add_one}, 
    {'f1': subtract_one, 'f2': subtract_one, 'f3': subtract_one, 'f4': subtract_one}, 
    {'f1': subtract_one, 'f2': add_one, 'f3': add_one, 'f4': add_one} 
] 

def apply_functions(function_dictionaries, function_names, starting_value=0): 
    results = [] 
    for d in function_dictionaries: 
     result = d.copy() 
     value = starting_value 
     for function_name in function_names: 
      value = d[function_name](value) 
     result['result'] = value 
     results.append(result) 
    return results 

pprint.pprint(apply_functions(function_dictionaries, ['f1', 'f2', 'f3', 'f4'])) 

# Output: 
# [{'f1': <function add_one at 0x10ae58048>, 
# 'f2': <function add_one at 0x10ae58048>, 
# 'f3': <function add_one at 0x10ae58048>, 
# 'f4': <function add_one at 0x10ae58048>, 
# 'result': 4}, 
# {'f1': <function add_one at 0x10ae58048>, 
# 'f2': <function add_one at 0x10ae58048>, 
# 'f3': <function add_one at 0x10ae58048>, 
# 'f4': <function add_one at 0x10ae58048>, 
# 'result': 4}, 
# {'f1': <function subtract_one at 0x10aec4048>, 
# 'f2': <function subtract_one at 0x10aec4048>, 
# 'f3': <function subtract_one at 0x10aec4048>, 
# 'f4': <function subtract_one at 0x10aec4048>, 
# 'result': -4}, 
# {'f1': <function subtract_one at 0x10aec4048>, 
# 'f2': <function add_one at 0x10ae58048>, 
# 'f3': <function add_one at 0x10ae58048>, 
# 'f4': <function add_one at 0x10ae58048>, 
# 'result': 2}] 
関連する問題