I've been learning python for a few days now, and I programmed this password generator after today's lesson (following the 100 days of code on udemy course). This code works like it should and gives me the desired results, but out of pure curiosity, I am interested in optimizing the code even more. If you do decide to give it the time to optimize an aspect of it, I will be forever grateful.
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']
print("Welcome to the PyPassword Generator!")
nr_letters = int(input("How many letters would you like in your password?\n"))
nr_symbols = int(input(f"How many symbols would you like?\n"))
nr_numbers = int(input(f"How many numbers would you like?\n"))
password = []
for req in range(0, nr_letters + 1):
    letter_index = random.randint(0, len(letters))
    password.append(letters[letter_index-1])
for sym in range(1, nr_symbols + 1):
    symbol_index = random.randint(0,len(symbols))
    password.append(symbols[symbol_index-1])
for num in range(1, nr_numbers + 1):
    number_index = random.randint(0,len(numbers))
    password.append(numbers[number_index-1])
random.shuffle(password)
print(*password,sep='')