#python #json #list #dictionary
#python #json #Список #словарь
Вопрос:
У меня есть файл json, который выглядит следующим образом:
[{"History": ["sally", "billy", "tommy"], "Calculus": [billy]}]
Я хочу просмотреть имена классов, поэтому, когда я добавляю следующий класс, я удостоверяюсь, что этого класса нет в списке. И затем я хочу обойти этот класс, чтобы убедиться, что ученик с тем же именем не добавлен дважды.
Я создал этот код:
with open('students.json') as j:
data = json.load(j)
for classRoom in data:
print "entered here4"
#classCheck = data[classRoom]
#this checks if the classroom is already in the dictionary of lists
if(className == classRoom):
print "entered here5"
for student in data[classRoom]:
if(studentName == student):
print "student already in this classroom"
sys.exit()
data[classRoom].append(studentName)
with open ('students.json', 'w') as outfile:
json.dump(data,outfile)
print "student added to class"
sys.exit()
if(className == classRoom):
Этот оператор if пропускается при запуске кода. И если я изменяю classCheck==data[classRoom]
, я получаю сообщение об ошибке «индексы списка должны быть целыми числами, а не dict . Что я могу изменить в цикле for, чтобы он проверял, существует ли имя класса или нет?
Комментарии:
1. Слово «класс» обычно является зарезервированным словом в объектно-ориентированных языках программирования, поэтому используйте другое имя переменной, такое как «classname» или «myclass» или «c».
2. @jarmod О, извините! Не понимал. Я изменил имена переменных. Надеюсь, это прояснит ситуацию
Ответ №1:
Вот что вы должны делать: предполагая data = [{"History": ["sally", "billy", "tommy"], "Calculus": [billy]}]
for classRoom, studentList in data[0].items(): #this grabs both keys and values in the dictionary, then
if className in classRoom:
#do something ..
for i in studentList: #since values are list
if studentName in i:# this grabs each values list and check if student exist there
#do somthing ...
Комментарии:
1. Спасибо, что помогло с поиском класса и имен, но когда я хочу добавить имя, я получаю сообщение об ошибке для строки добавления: «индексы списка должны быть целыми числами, а не юникодом». Как я могу изменить имя добавления, чтобы оно добавлялось к этому классу? Редактировать: понял, спасибо!
Ответ №2:
Как указано в комментариях, «класс» является зарезервированным ключевым словом, но в противном случае просто имейте два словаря («студенты» и «классы») и отметьте добавить ученика или класс после проверки, что его еще нет.
Комментарии:
1. Да, извините, я изменил его. Я все еще новичок в python, не понял. Вместо того, чтобы иметь два словаря, есть ли способ изменить мой цикл for, чтобы он мог проверять ключи? Затем он может перейти в оператор if, чтобы посмотреть, добавляет ли он имя или нет.
Ответ №3:
Ваш json — это список словарей. Когда вы выполняете итерацию по списку,
for classRoom in data:
# classRoom is the whole dictionary - {"History": ["sally", "billy", "tommy"], "Calculus": ["billy"]}
Измените JSON на словарь, подобный этому-
{"History": ["sally", "billy", "tommy"], "Calculus": ["billy"]}
Теперь,
for classRoom in data:
# classRoom is a key-value pair - "History": ["sally", "billy", "tommy"] for the first iteration