2017-05-21 2 views
1

Anfänger Lösung - funktioniertWie zu verwenden reduzieren ohne Lambda

Hallo Leute. Es ist mir gelungen, einen Code zu schreiben, der true zurückgibt, wenn alle Einträge in einer Liste Primzahlen sind. Ich denke, dass dies ein guter Kandidat ist für „reduzieren“ - bis jetzt habe ich nur in Verbindung verwendet habe, mit Lambda reduziert - ist es möglich, Lambda zu vermeiden und direkte Funktion

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 

alternativ reduziert Verwendung verwenden

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 

Druck 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) 

Von hier aus geht nicht

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]) 

Fehlermeldung:

int Argument String sein muss oder int Liste nicht

Entschuldigungen für frühere Post - aus Versehen ohne abgeschlossene geschickt

+2

Was erwarten Sie von 'int (values)'? Wie die Fehlermeldung sagt, können Sie 'int()' nicht auf einer Liste aufrufen, und die Elemente in 'values' sind bereits ganze Zahlen. –

+0

"Code, der true zurückgibt, wenn _all_ Elemente in einer Liste Primzahlen sind" Warum denken Sie, dass 'reduce' eine gute Wahl dafür wäre, und nicht, nun, [' all'] (https: //docs.python .org/3.5/library/functions.html # alle)? –

Antwort

2

Bitte benutzen Sie die Boolesche True und False und nicht die Strings "True" und "False". Hier finden Sie Ihre Funktion, wenn Sie Boolesche Werte waren eher zu verwenden als Strings:

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

Aber das wäre falsch als a keine Zahl, sondern das vorherige Ergebnis so sollte es als

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

Aber ich würde das Prädikat und das Minderer und Schreiben als vorschlagen heben:

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

Aber das reduziert, ist besser geschrieben als:

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

Und dann die Karten entfernt werden können:

return all(is_prime_no(int(v)) for v in values) 

, die die Form ist dies die ich sehr bevorzugen.

Verwandte Themen