Вопрос по оптимизации кода по заданию обучения. Урок работа с массивом данных
Изучаю питон. Хочу знать мнение знатоков. Правильно ли выполнил задание? Какие есть недоработки? Предложения по более практичному, надёжному и красивому написанию кода приветствуются. Так же под каждой строчкой кода я оставляю комментарий к нему - скажите насколько правильно я сам понимаю что пишу? Вот задача:
- Создайте список, состоящий из строк.
- Выведите все элементы списка в таком виде: «ИНДЕКС_ЭЛЕМЕНТА – ЭЛЕМЕНТ;»
- Попросите пользователя ввести индекс того элемента, значение которого он хочет посмотреть.
- Выведите значение элемента по индексу, полученному от пользователя. Примечание: если пользователь ввёл индекс, которого нет, то написать ему об этом так: «Элемента с таким индексом не существует». Код:
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 шт):
Чтоб получить кортежи (номер элемента списка, значение) можно воспользоваться 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('Элемента с таким индексом не существует')
Что-то вы навбивали гвоздей микроскопом
НЕЛЬЗЯ проверять все индексы поиндексно как строки - а если у вас строка с миллиардом элементов?
Вот так получше будет:
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]}")
Что можно:
использовать функцию
enumerate- она ставит каждому элементу списка в соответствие индекс и формирует список в виде парыиндекс;значениеиспользовать f-строки, чтобы выводить единой строкой - визуально чаще это удобно
f"текст {переменная или кусок кода} текст"использовать длину списка, полученному с помощью функции
len(), как ограничитель по возможному индексу - т.е. если индекс меньше нуля или больше и равен длине списка, то элемента с таким индексом не существуетя в своем коде это не привел, но в одном из ответов вам это было - проверять ввел ли пользователь целое число или треш и на треш также выдавать ошибку
если
if elseиспользует по одной строчке, то можно использовать тернарный оператор (т.е. однострочную записьif else)<действие при выполнении условия> if <условие> else <действие при невыполнении условия>
аналог сишного () ? :
На примитивном уровне:
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('Элемента с таким индексом не существует')
Про встроенную функцию 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 для выхода из программы - ")