Как мне выполнить итерацию по списку словарей, чтобы убедиться, что я не добавляю одно и то же имя?

#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