Вопрос по оптимизации кода по заданию обучения. Урок работа с массивом данных

Изучаю питон. Хочу знать мнение знатоков. Правильно ли выполнил задание? Какие есть недоработки? Предложения по более практичному, надёжному и красивому написанию кода приветствуются. Так же под каждой строчкой кода я оставляю комментарий к нему - скажите насколько правильно я сам понимаю что пишу? Вот задача:

  1. Создайте список, состоящий из строк.
  2. Выведите все элементы списка в таком виде: «ИНДЕКС_ЭЛЕМЕНТА – ЭЛЕМЕНТ;»
  3. Попросите пользователя ввести индекс того элемента, значение которого он хочет посмотреть.
  4. Выведите значение элемента по индексу, полученному от пользователя. Примечание: если пользователь ввёл индекс, которого нет, то написать ему об этом так: «Элемента с таким индексом не существует». Код:
    elems = ['element_0', 'element_1', 'element_2', 'element_3'] #массив
    i = 0 #переменная для переборки массива по индексу
    while i < len(elems): #пока переменная шага < длинны массива
        print('Индекс =', i, 'Элемент =', elems[i]) #вывести номер индекса и его содержимое
        i += 1 #шаг переменной +1 за цикл
    ui = input("Введите индекс элемента > ").lower() #переменная ввода юзера (с разным регистром)
    if ui in '0': elems[0] = 'elem1', print('Индекс_0 -', elems[0]) #если ввод == 0, вывести из массива индекс 0 через принт
    elif ui in '1': elems[1] = 'elem2', print('Индекс_1 -', elems[1]) #здесь и далее аналогично первому if
    elif ui in '2': elems[2] = 'elem3', print('Индекс_2 -', elems[2])
    elif ui in '3': elems[3] = 'elem4', print('Индекс_3 -', elems[3])
    else:
        print('Элемента с таким индексом не существует') #если ввод не 0,1,2 или 3 - принт ошибки.

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

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

Чтоб получить кортежи (номер элемента списка, значение) можно воспользоваться enumerate. И индекс можно проверить одним орератором if

elems = ['element_0', 'element_1', 'element_2', 'element_3']  # массив
for i, elem in enumerate(elems):
    print(f'Индекс = {i} Элемент = {elem}')  # вывести номер индекса и его содержимое
ui = int(input("Введите индекс элемента > "))  # переменная ввода юзера
if 0 <= ui < len(elems):
    print(f'Индекс_{ui} - {elems[ui]}')
else:
    print('Элемента с таким индексом не существует')
→ Ссылка
Автор решения: Zhihar

Что-то вы навбивали гвоздей микроскопом

НЕЛЬЗЯ проверять все индексы поиндексно как строки - а если у вас строка с миллиардом элементов?

Вот так получше будет:

elems = ['element_0', 'element_1', 'element_2', 'element_3'] #массив

for obj in enumerate(elems):
    print(f"Индекс = {obj[0]}, Элемент = {obj[1]}")

ui = int(input("Введите индекс элемента > "))

if ui < 0 or ui >= len(elems):
    print('Элемента с таким индексом не существует')  # если ввод не 0,1,2 или 3 - принт ошибки.
else:
    print(f"Индекс = {ui}, Элемент = {elems[ui]}")

Хочется коротких решений - можно так:

[print(f"Индекс = {obj[0]}, Элемент = {obj[1]}") for obj in enumerate(elems)]

ui = int(input("Введите индекс элемента > "))

print('Элемента с таким индексом не существует' if 0 < ui >= len(elems) else f"Индекс = {ui}, Элемент = {elems[ui]}")

Что можно:

  1. использовать функцию enumerate - она ставит каждому элементу списка в соответствие индекс и формирует список в виде пары индекс;значение

  2. использовать f-строки, чтобы выводить единой строкой - визуально чаще это удобно

     f"текст {переменная или кусок кода} текст"
    
  3. использовать длину списка, полученному с помощью функции len(), как ограничитель по возможному индексу - т.е. если индекс меньше нуля или больше и равен длине списка, то элемента с таким индексом не существует

  4. я в своем коде это не привел, но в одном из ответов вам это было - проверять ввел ли пользователь целое число или треш и на треш также выдавать ошибку

  5. если if else использует по одной строчке, то можно использовать тернарный оператор (т.е. однострочную запись if else)

     <действие при выполнении условия> if <условие> else <действие при невыполнении условия>
    

аналог сишного () ? :

→ Ссылка
Автор решения: GrAnd

На примитивном уровне:

elems = ['element_0', 'element_1', 'element_2', 'element_3', 'element_4']
for i, el in enumerate(elems): 
    print('Индекс =', i, 'Элемент =', el)

while True:
    ui = input("Введите индекс элемента > ").lower()
    if ui.isdigit():
        break
    print("Индекс - это число!")

i = int(ui)
if 0 <= i < len(elems):
    print(f'Индекс_{i} -', elems[i])
else:
    print('Элемента с таким индексом не существует')
→ Ссылка
Автор решения: SergFSM

Про встроенную функцию enumerate() вам уже написали, но в принципе можно обойтись и без нее. В примере также использованы: списковое включение (list comprehension), распаковка (*), тернарный (ternary) оператор и моржовый (walrus) оператор. Примерно так:

elems = ['element_0', 'element_1', 'element_2', 'element_3']

r = range(len(elems))
print(*[f'Индекс_{j} - {elems[j]}' for j in r], sep='\n') 
i = f'Индекс_{i} - {elems[i]}' if (i:=int(input("Введите индекс элемента > "))) in r else ''
print(i or 'Элемента с таким индексом не существует')
→ Ссылка
Автор решения: Олег
rint("Задание №1  №2 ")
pst = ["Воронежский","Мичуринский","Московский","Ленинградский"]
i=0
while i< len (pst):
    print("Индекс элемента - ",i, "Элемент - ",pst[i])
    i+=1
print("Задание №3")

pst = ["Воронежский","Мичуринский","Московский","Ленинградский"]
i=0
x=input("Введите номер постамата с 0-9 -")
i=int(x)
if i< len(pst):
 print(pst[i])
if i>len(pst):
    print("Такого постамата в списке нет")
→ Ссылка
Автор решения: Олег
pst = ["Воронежский","Мичуринский","Московский","Ленинградский"]
i=0
y=str("go")
while y !="thanks":
     x=input("Введите номер постамата с 0-9 -")
     i=int(x)
     if i< len(pst):
        print(pst[i])
     if i>len(pst):
      print("Такого постамата в списке нет")
     y=input("Введите thanks для выхода из программы - ")
→ Ссылка