#python
#python
Вопрос:
def Reset():
data = []
data.append({
'year': now.year,
'months': []
})
for year in range(len(data)):
for month in range(12):
data[year].months.append({
'month': (month 1),
'days': []
})
if (month 1 == 2):
daysAmount = 28
if (isinstance(year/4, int)):
daysAmount = 29
elif (month 1 == 12):
daysAmount = 31
elif (isinstance((month 1)/2, int)):
daysAmount = 30
else:
daysAmount = 31
for day in range(daysAmount):
data[year].months[month].days.append({
'day': (day 1),
})
with open('./data.txt', 'w') as outfile:
json.dump(data, outfile)
Reset()
Я изменил код, но теперь появилась другая ошибка, которую я не понимаю. Что мне делать с этим? Как вы можете видеть, у него есть атрибут months …
line 13, in Reset
data[year].months.append({
AttributeError: 'dict' object has no attribute 'months'
Комментарии:
1. Сообщение об ошибке сообщает вам, что
len(data)
это число, а не то, что вы можете повторить. Вы имели в видуfor year in data
?2. используйте
for _ in range(len(var)):
3. Пожалуйста, не редактируйте свой вопрос, чтобы полностью удалить сам исходный вопрос и задать новый / последующий вопрос. (Я вижу, что вы также попросили ответчика дать разъяснения в комментариях, и он их отсортировал.)
Ответ №1:
Да, есть способ получить количество элементов в списке данных вместо фактических объектов в переменной ‘year’, и для этого вы должны использовать
for year in range(len(data)):
следующим образом
import json
import datetime
now = datetime.datetime.now()
def Reset():
data = []
data.append({
'year': now.year,
'months': []
})
for year in range(len(data)):
for month in range(12):
data[year]['months'].append({
'month': (month 1),
'days': []
})
if (month 1 == 2):
daysAmount = 28
if (isinstance(year/4, int)):
daysAmount = 29
elif (month 1 == 12):
daysAmount = 31
elif (isinstance((month 1)/2, int)):
daysAmount = 30
else:
daysAmount = 31
for day in range(daysAmount):
data[year]['months'][month].days.append({
'day': (day 1),
})
with open('./data.txt', 'w') as outfile:
json.dump(data, outfile)
Reset()
Другим способом было бы использовать
for year in data:
следующим образом
import json
import datetime
now = datetime.datetime.now()
def Reset():
data = []
data.append({
'year': now.year,
'months': []
})
for year in data:
for month in range(12):
year['months'].append({
'month': (month 1),
'days': []
})
if (month 1 == 2):
daysAmount = 28
if (isinstance(year/4, int)):
daysAmount = 29
elif (month 1 == 12):
daysAmount = 31
elif (isinstance((month 1)/2, int)):
daysAmount = 30
else:
daysAmount = 31
for day in range(daysAmount):
year['months'][month].days.append({
'day': (day 1),
})
with open('./data.txt', 'w') as outfile:
json.dump(data, outfile)
Reset()
Комментарии:
1. Я попробовал это и получил сообщение об ошибке, см. Сообщение выше.
2. Да, но мне нужен верхний пример, потому что далее в коде мне нужна переменная year как число для некоторых математических уравнений. Однако первая ошибка. я изменил основной вопрос.
3. Понял. Python Dicts — это не то же самое, что JavaScript Dicts. Нам нужно получить доступ к месяцам как
data[year]['months']
, а не какdata[year].months
.4. Секундочку. Редактирование
5. Внес эти изменения!
Ответ №2:
Функция len() возвращает целое число.
for x in y:
y здесь должен быть список или что-то итеративное, а не целое число
используя len(data)
ваш просто возвращает длину списка
вы должны использовать
for year in data:
Ответ №3:
когда вы выполняете len(data), он возвращает целое число, которое не может быть повторено;
следовательно, вы должны сделать что-то вроде:
for year in range(len(data))
или
for item in data.item:
year = item['year']
...
Ответ №4:
Вы получаете сообщение об ошибке, потому что вы из этой строки
for year in len(data):
Этот len(data) возвращает целое число, и это невозможно повторить.
Вместо этого вы можете сделать это
for item in data:
year = item['year']
или
for index in range(len(data)):
item = data[index]
Комментарии:
1. Это то, что мне было нужно, спасибо!