2016-12-07 5 views
1

私は文字列のリストを持っており、文字列内のすべての文字に対して関数を呼び出す必要があります。変数を各関数に代入するときに、それらを実行したくない場合は、文字列を反復処理するときにのみ呼び出すことができます。ここに私のコードです:リストから関数を呼び出す - Python

import random 

def make_s(): 
    result = '' 

    V = make_v 
    C = make_c 
    P = make_p 
    B = make_b 

    structs = ['VPCVBCC', 'VCVVC', 'VVPCC', 'VCVBCC', 'VPCCVBC', 'VCVCC', 'VPCBC', \ 
      'VVPCVBCC', 'VCVC', 'VPCVVBC'] 

    struct = random.choice(structs) 

    for elem in struct: 
     /* Call function defined above and add the result to the result string */ 
     result += elem() 

    return result 

これを行う最善の方法は何ですか?

多くのありがとう:)

+1

することが容易であるかもしれません –

答えて

4

あなたはかなり近いです。特定の変数に割り当てるのではなく、文字を関数にマッピングするだけでよいのです。

import random 

def make_s(): 
    result = '' 

    # Here we have a mapping between the characters you see, 
    # and the functions you want to call. 
    my_funcs = {"V": make_v, 
       "C": make_c, 
       "P": make_p, 
       "B": make_b} 

    structs = ['VPCVBCC', 'VCVVC', 'VVPCC', 'VCVBCC', 'VPCCVBC', 'VCVCC', 'VPCBC', \ 
      'VVPCVBCC', 'VCVC', 'VPCVVBC'] 

    struct = random.choice(structs) 

    for elem in struct: 
     # Lookup the function in your dictionary 
     func_to_call = my_funcs[elem] 
     # And call it! 
     result += func_to_call() 

    return result 
+0

Brilliant、ありがとう:) – ggordon

+0

どの関数にどの変数名が割り当てられているのか(コード内で)調べるのは難しいことがよくあります。私の変数 "V"が指し示すオブジェクトに "" V字型の文字を入れることは、一般的にハックであり、このようなdictによって回避することができます。 – turbulencetoo

+1

'my_funcs = {'V':make_v()、 'C':make_c()、 'P':make_p()、 'B':make_b()}'を実行すると、 'for elem in struct:result + = my_funcs [elem]' –

2

同様のアプローチ列join機能リストの内包&を使用して、もう少し簡潔、電話を機能させる文字をマッピングするための辞書を使用して: `ではなく` list`のdict`を使用して

import random 
def make_s(): 
    fDict = {'V': make_v(), 'C': make_c(), 'P': make_p(), 'B': make_b()} 
    structs = ['VPCVBCC', 'VCVVC', 'VVPCC', 'VCVBCC', 'VPCCVBC', 'VCVCC', 'VPCBC', \ 
      'VVPCVBCC', 'VCVC', 'VPCVVBC'] 
    struct = random.choice(structs) 
    return ''.join([fDict[elem] for elem in struct]) 
+0

おかげで、関数が実行されるたびに異なる出力が生成されることを指摘しておきたいので、上記のメソッドはうまく動作します – ggordon

+0

あまりにもあまりにも遠すぎたかもしれません:) 'random.choice(structs)それが理解の一部ではないように(出力には影響しないとは思うが)、これは他の答えと機能的に同じでなければならないと思う。それ以外の場合は、「実行するたびに異なる出力」についてどのような区別をしているのかを確認しないでください。乾杯 –

関連する問題