Поиск по вложенному списку - PullRequest
0 голосов
/ 28 марта 2020

У меня проблемы с поиском дубликатов в моей программе. Мне нужно добавить нового студента в мой список, но если введенный идентификатор уже используется, программа должна напечатать, что идентификатор уже используется и не может быть добавлен в список. Мой список:

ID, NAME, MAJOR, SCORE = 0, 1, 2, 3
s_list = [
    ['01', 'Smith', 'CS', 100],
    ['02', 'Jones', 'CS', 90],
    ['03', 'Anderson', 'Math', 80],
    ['04', 'Johnson', 'Bio', 99],
]
def stu_list(s_list):
    print('Student List:')
    print('Id'.ljust(5), 'Name'.ljust(12), 'Major'.ljust(9), 'Score')
    for ID, NAME, MAJOR, SCORE in s_list:
        print(f'{ID:6}{NAME:13}{MAJOR:8}{SCORE:5}')
    print('--End of List--\n')

ОБНОВЛЕНО:

def insert_stu(s_list):
    print('Adding a student.')
    n_ID = input('ID: ')
    n_NAME = input('Name: ')
    n_MAJOR = input('Major: ')
    n_SCORE = int(input('Score: '))

    id_list = []
    for stud in s_list:
        id_list.append(stud[0])

        if n_ID in id_list:
            print(f'{n_ID} already exists, unable to add student')
        elif n_ID not in s_list:
                new_stu = [n_ID, n_NAME, n_MAJOR, n_SCORE]
                s_list.append(new_stu)
                print(f'Not Found \nAdding to the list.')
        stu_list(s_list)
        return insert_stu(s_list)

ВЫХОД:

Adding a student.
ID: 02
Name: Cris
Major: math
Score: 23
Not Found 
Adding to the list.
Student List:
Id    Name         Major     Score
01    Smith        CS        100
02    Jones        CS         90
03    Anderson     Math       80
04    Johnson      Bio        99
09    new          cs         90
02    Cris         math       23   ##still adding duplicate id's
--End of List--

Когда я запускаю функцию, она добавляет нового ученика независимо от того, является ли введенный идентификатор Уже в использовании. Я думаю, что у меня проблема с получением переменной ID для связи с первым столбцом в s_list ('01', '02', ...).

Ответы [ 3 ]

1 голос
/ 28 марта 2020

Вы проводите сравнение по полной записи студента, а не только по ID. Это можно исправить, изменив код ниже:

for i in s_list:            ##not searching list for duplicate
    if n_ID == i:

на:

for i in s_list:            ##not searching list for duplicate
    if n_ID == i[0]:

или просто используя словарь вместо списка.

РЕДАКТИРОВАТЬ Ваша вторая версия создает список идентификаторов одновременно с проверкой, поэтому для l oop добавляется существующий студент, потому что он еще не может добавить его в список идентификаторов. Вы добавляете идентификатор 02, потому что идентификатор в первой итерации l oop равен 01. Я бы изменил на это (не самый эффективный код, просто пытаюсь внести минимальные изменения в существующий код):

for stud in s_list:
    id_list.append(stud[0])

if n_ID in id_list:
    print(f'{n_ID} already exists, unable to add student')
elif n_ID not in s_list:
    new_stu = [n_ID, n_NAME, n_MAJOR, n_SCORE]
    s_list.append(new_stu)
    print(f'Not Found \nAdding to the list.')
stu_list(s_list)
return s_list
1 голос
/ 28 марта 2020

Для поиска идентификатора дубликата и дальнейшей обработки.

вы можете создать список идентификаторов учащихся, а затем проверить наличие дубликатов в этом списке.

def insert_stu(s_list):
    print('Adding a student.')
    n_ID = input('ID: ')
    n_NAME = input('Name: ')
    n_MAJOR = input('Major: ')
    n_SCORE = int(input('Score: '))

    id_list = []
    for stud in s_list:      # creating list of ID
        id_list.append(stud[0])

    if n_ID in id_list:      # searching list for duplicate
        print(f'{n_ID} already exists, unable to add student')
    elif n_ID not in s_list:
        new_stu = [n_ID, n_NAME, n_MAJOR, n_SCORE]
        s_list.append(new_stu)
        print(f'Not Found \nAdding to the list.')
    stu_list(s_list)
    return insert_stu(s_list)

1 голос
/ 28 марта 2020

Ваш код не работает, потому что вы сравниваете идентификатор с полной записью об ученике.

for i in s_list:      # i is the full record about the student   
   if n_ID == i[0]:   # i[0] is the student's id
      print(f'{n_ID} already exists, unable to add student')
      return add_stu(s_list)

# If the for loop finished, then no match was found
s_list.append(new_stu)
stu_list(s_list)
print('Student added')
return add_stu(s_list) 

Код, подобный этому, будет работать, но он рекурсивный - вы вызываете add_stu () изнутри себя , Скорее всего, это не то, что вы хотите. Обычно такие задачи выполняются с помощью команды al oop, в которой вы запрашиваете ввод пользователя и разбиваете l oop, если ввод пользователя правильный:

def add_stu(s_list):
    print('Adding a student.')
    while(true):
        n_ID = input('ID: ')
        n_NAME = input('Name: ')
        n_MAJOR = input('Major: ')
        n_SCORE = int(input('Score: '))
        student_exists = false
        for i in s_list: 
             if n_ID == i[0]:
                  student_exists = true
                  break
        if not student_exists:
             new_stu = [n_ID, n_NAME, n_MAJOR, n_SCORE]
             s_list.append(new_stu)
             print('Student added')
             return s_list
        print(f'{n_ID} already exists, unable to add student')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...