2016-07-24 18 views
0

Ich habe an diesem Code seit ungefähr einem Tag gearbeitet. Ein paar Stunden auf nur diesem einen Teil sagt es immer wieder, dass ich in Zeile 26 einen Attributfehler habe. Leider sind das alle Informationen, die ich habe. Ich habe unzählige verschiedene Möglichkeiten ausprobiert und viele Websites/Foren durchsucht. Ich schätze jede Hilfe. Hier ist der Code:Python Attribut Fehler if Anweisung

import itertools 
def answer(x, y, z): 
    monthdays = {31, 
       28, 
       31, 
       30, 
       31, 
       30, 
       31, 
       31, 
       30, 
       31, 
       30, 
       31} 
    real_outcomes = set() 
    MONTH = 0 
    DAY = 1 
    YEAR = 2 

    #perms = [[x, y, z],[x, z, y],[y, z, x],[y, x, z],[z, x, y],[z, y, x]] 
    possibilities = itertools.permutations([x, y, z]) 
    for perm in possibilities: 
     month_test = perm[MONTH] 
     day_test = perm[DAY] 
     #I keep receiving an attribute error on the line below 
*  if month_test <= 12 and day_test <= monthdays.get(month_test): 
      real_outcomes.add(perm) 

    if len(realOutcomes) > 1: 
     return "Ambiguous" 
    else: 
     return "%02d/%02d/%02d" % realOutcomes.pop() 

Antwort

0

Das Problem ist, dass monthdays keine get() Methode hat, und das ist, weil monthdays ein set, kein dict wie Sie wahrscheinlich erwarten.

Mit Blick auf Ihren Code scheint es, dass eine Liste oder ein Tupel für monthdays geeignet wäre. Ein Satz ist nicht sinnvoll, weil es nicht bestellt und kann nicht enthalten Duplikate:

monthdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 

und dann:

if month_test < len(monthdays) and day_test <= monthdays[month_test]: 

Ihr Code schlägt vor, dass Sie schließlich Jahren behandeln wollen. In diesem Fall sollten Sie sich das Modul calendar ansehen. Es stellt die Funktion monthrange() zur Verfügung, die die Anzahl der Tage für ein bestimmtes Jahr und einen bestimmten Monat angibt und Schaltjahre behandelt.

from calendar import monthrange 

try: 
    if 1 <= perm[DAY] <= monthrange(perms[YEAR], perm[MONTH])[1]: 
     real_outcomes.add(perm) 
except ValueError as exc: 
    print(exc) # or pass if don't care 
+0

Nur eine kurze Frage, warum wäre nicht ein Diktat? +1 –

+0

@PythonMaster: weil das ist die Syntax für die Deklaration eines 'set'. Ein Wörterbuch enthält Schlüsselwerte _und_, nicht nur Werte. – mhawke

+0

Ich habe es gerade zu einem Diktat geändert und es funktioniert perfekt! Wie gesagt, ich bin ein wenig neu bei Python. Ich werde auch eine Version mit dem Code versuchen, den Sie angegeben haben. Ich schätze die Hilfe! Ich dachte, der Doppelpunkt hätte es gespleißt, anstatt einen Schlüssel zu setzen –

-2

Set-Objekte ('monthdays' in Ihrem Fall) nicht Attribut 'get' haben

Sie über sie iterieren sollte oder wandeln sie aufzulisten, zB:

list(monthdays)[0] die zurück erster Punkt der resultierenden Liste

+0

Ein Set kann keine Duplikate enthalten und es gibt keine inhärente Reihenfolge. Daher ist eine Iteration oder eine Umwandlung in eine Liste nicht hilfreich. – mhawke

+0

Was hat mein Snippet mit Duplikaten und inhärenter Reihenfolge zu tun? Ich zeige nur, wie er Artikel davon bekommen kann – Bob

+0

versuchen Sie, Ihren Code auszuführen, und Sie sollten das Problem sehen, dass ich erstelle. – mhawke