Работа со строками на Python

Пусть дана строковая переменная, содержащая информацию о студентах вида:

my_string = "ФИО;Возраст;Категория;_Иванов Иван Иванович;23 года;Студент 3 курса;_Петров Семен Игоревич;22 года;Студент 2 курса;_Иванов Семен Игоревич;22 года;Студент 2 курса;_Акибов Ярослав Наумович;23 года;Студент 3 курса;_Борков Станислав Максимович;21 год;Студент 1 курса;_Петров Семен Семенович;21 год;Студент 1 курса;_Романов Станислав Андреевич;23 года;Студент 3 курса;_Петров Всеволод Борисович;21 год;Студент 2 курса"

Вариант 1. Выведите построчно информацию о студентах, чей возраст — 21 год.

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

Вариант 3. Выведите построчно информацию о студентах, чьи фамилии начинаются на букву "А" или "Б".

Моя попытка

my_string = my_string.split(';') 
for i in range(3, len(my_string) - 2, 3): 
    if my_string[i].startswith('21'): 
        print(my_string[i], my_string[i + 1], my_string[i + 2])

Ответы (1 шт):

Автор решения: Amgarak

Ну раз пытались, попробуйте тогда так:

my_string = "ФИО;Возраст;Категория;_Иванов Иван Иванович;23 года;Студент 3 курса;_Петров Семен Игоревич;22 года;Студент 2 курса;_Иванов Семен Игоревич;22 года;Студент 2 курса;_Акибов Ярослав Наумович;23 года;Студент 3 курса;_Борков Станислав Максимович;21 год;Студент 1 курса;_Петров Семен Семенович;21 год;Студент 1 курса;_Романов Станислав Андреевич;23 года;Студент 3 курса;_Петров Всеволод Борисович;21 год;Студент 2 курса"

students_info = my_string.split('_') 
# Разбиваем строку через сплит использяю '_' как разделитель 
# Получаем список:
# ['ФИО;Возраст;Категория;', 'Иванов Иван Иванович;23 года;Студент 3 курса;', ит.д..
# students_info = students_info.pop(0) мы могли бы удалить лишний 
# элемент списка 'ФИО;Возраст;Категория;' но можем этого и не делать

# Вариант 1
print("Вариант 1:")
# Полученный ранее список мы можем перебрать в цикле и найти все
# вхождения '21 год' в его элементах
for student in students_info:
    if '21 год' in student:
        print(student)

# Вариант 2
print("\nВариант 2:")
for student in students_info:
    age_str = student.split(';')[1]
    # Тут мы так же итерируем список, но дополнительно разбиваем 
    # его элементы на еще один список через сплит по разделителю ';' 
    # ['Петров Всеволод Борисович', '21 год', 'Студент 2 курса']
    # в age_str помещаем значение под индексом [1] - '21 год'
    try:
         age = int(age_str[:3])
         # Тут мы делаем срез из строки '21 год', что бы получить
         # только нужную часть с числом
         if age > 21: 
             print(student)
    except ValueError as ve:
        pass # Тут я добавил исключение, так как не убрал из списка students_info
             # 'ФИО;Возраст;Категория;' и при попытке перевода строки в int
             # выбьет исключение 

# Вариант 3
print("\nВариант 3:")
for student in students_info:
    last_name = student.split(';')[0].split()[-1]# или 0?
    # last_name1 = student.split(';')[0] - Петров Всеволод Борисович
    # Тут так же через сплит мы по индексу [0] получаем строку с ФИО
    # Добавляем еще один сплит без параметра и разбиваем полученную
    # строку на отдельные элементы используя ' ' как разделитель по умолчанию
    # Дальше по индексу [0], [1], [2] мы можем дернуть нужное ФИО
    # И уже через startswith можем сравнить начинается ли найденная строка с 'А' или 'Б'
    if last_name.startswith(('А', 'Б')):
        print(student)

Строковые методы split и join в Python

Итерация списка в Python

Срезы в Python

→ Ссылка