2016-07-24 3 views
0

Я работаю над этим кодом примерно через день. Через несколько часов на этой одной части он говорит, что у меня есть ошибка атрибута строки 26. К сожалению, это все, что у меня есть. Я пробовал множество различных способов исправить это и искал много сайтов/форумов. Я ценю любую помощь. Вот код:Ошибка атрибута Python, если оператор

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

ответ

0

Проблема заключается в том, что monthdays не имеет метод get(), и это потому, что monthdays является set, не dict, как вы, вероятно, ожидать.

Глядя на ваш код, кажется, что список или кортеж был бы подходящим для monthdays. Набор не является полезным, потому что он не заказывали и не может включать дубликаты:

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

, а затем:

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

Ваш код предполагает, что в конечном итоге вы хотите, чтобы справиться лет. В этом случае вы должны посмотреть на модуль calendar. Он предоставляет функцию monthrange(), которая дает количество дней для данного года и месяца и обрабатывает високосные годы.

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

Просто быстрый вопрос, почему бы не назвать диктофон? +1 –

+0

@PythonMaster: потому что это синтаксис для объявления 'set'. Словарь содержит ключи _and_ значения, а не только значения. – mhawke

+0

Я на самом деле просто изменил его на диктофон, и он отлично работает! как я уже сказал, я немного новичок в python. Я также собираюсь попробовать версию с кодом, который вы дали. Я ценю помощь! Я думал, что двоеточие спланировало бы его вместо того, чтобы устанавливать ключ –

-2

набор объектов («MonthDays» в вашем случае) не имеют атрибут «получить»

вы должны перебрать или преобразовать его в список, например:

list(monthdays)[0] вернет первый элемент результирующего списка

+0

Набор не может содержать дубликатов, и не существует встроенного порядка. Таким образом, итерация или преобразование в список не будут полезны. – mhawke

+0

Что мой фрагмент имеет отношение к дубликатам и внутреннему порядку? Я просто показываю, как он может получить предметы из него – Bob

+0

попробуйте запустить код, и вы должны увидеть проблему, которую я поднимаю. – mhawke

Смежные вопросы