2017-05-21 6 views
1

初心者の解答 - 作品ラムダなしでreduceを使用する方法

こんにちは。リスト内のすべてのアイテムが素数であれば真を返すコードを書くのに成功しました。今私は使用しているまで ラムダと一緒に減らす - - 私は、これは「削減」のための良い候補 だと思う、直接関数にラムダを避けて使用することが可能である

def is_prime(list): 
    np = "Prime" 
    for n in list: 
     if n < 2: 
      np = "NonPrime" 
      print np 
     else: 
      for i in range(3, n): 
       if n % i == 0: 
        np ="NonPrime" 
        print np 
    return np 
x = is_prime([3,5,13]) 
print x 

代わりに減らす使用して

ここから
def is_prime_no(x): #"True" represents Prime 
    np = "True" 
    if x < 2: 
     np = "False" 
    else: 
     for i in range(3, x): #int(math.sqrt(n)) 
      if x % i == 0: 
       np ="False" 
    return np 

印刷is_prime_no(12)

def prime_check(a,b): 
    if is_prime_no(a) == "True" and is_prime_no(b) == "True": 
     return "True" 
    else: 
     return "False" 

print "prime check result ", prime_check(13,17) 

動作しません。
values = [13,17,2,19] 
def list_prime_check(values): 
    return reduce(prime_check, int(values)) 
print "Checking that all items in list are prime ", list_prime_check([0, 37, 40, 100]) 

エラーメッセージ:

int型の引数は文字列でなければならないか、前のポストのための

謝罪表示されませint型 - 誤っ

+2

'int(値)'に何を期待しますか?エラーメッセージによれば、リスト上で 'int()'を呼び出すことはできませんし、 'values'の項目はすでに整数です。 –

+0

"リスト内の_all_項目が素数である場合にtrueを返すコード"なぜ、 'reduce'がこれに適していると思うのですか?そして、うーん、[' all'](https://docs.python .org/3.5/library/functions.html#all)? –

答えて

2

を完了されずに送信されるには、ブール値Trueを使用してくださいと文字列"True"および"False"ではなく、Falseです。あなたは文字列ではなく、ブール値を使用した場合、次はあなたの関数である:

def prime_check(a,b): 
    return is_prime_no(a) and is_prime_no(b) 

をしかしaは数ではなく、前回の結果ではないとして、それは

def prime_check(a,b): 
    return a and is_prime_no(b) 
ように記述しなければならないので、これは正しくないだろう

しかし、私は出て述語と減速を持ち上げるととして、それを書くことをお勧め:

from operator import and_ 
def list_prime_check(values): 
    return reduce(and_, map(is_prime_no, map(int, values))) 

しかし、それは減らすが、より良いように記述されています

return all(map(is_prime_no, map(int, values))) 

そしてマップを除去することができる:

私は非常に好むこれの一形態である
return all(is_prime_no(int(v)) for v in values) 

関連する問題