Este es un proyecto personal mío y en este momento mi programa es un montón de declaraciones basadas en diccionarios basados en diccionarios que hice con cada número de episodio de cada temporada (diferentes temporadas tienen un número diferente de episodios) y el título. Obtengo los resultados deseados, sin embargo, estoy atascado en tratar de encontrar un método más avanzado, como el uso de una función, la comprensión de listas u objetos para mostrarlo de manera más elegante y con menos líneas de código.

He estado tratando de descubrir cómo usar uno de estos otros métodos a través de google y tutoriales, pero no puedo entender cómo puedo aplicarlo a mi programa específico para obtener los resultados sin todas estas declaraciones if individuales .

epTitles1 = {"1" : "The Gang Gets Racist",
             "2" : "Charlie Wants an Abortion",
             "3" : "Underage Drinking: A National Concern",
             "4" : "Charlie Has Cancer",
             "5" : "Gun Fever",
             "6" : "The Gang Finds a Dead Guy",
             "7" : "Charlie Got Molested"}

epTitles2 = {"1" :  "Charlie Gets Crippled",
             "2" : "The Gang Goes Jihad",
             "3" :  "Dennis and Dee Go on Welfare",
             "4" : "Mac Bangs Dennis' Mom"  ,
             "5" : "Hundred Dollar Baby"    ,
             "6" : "The Gang Gives Back",
             "7" : "The Gang Exploits a Miracle",
             "8" : "The Gang Runs for Office",
             "9" : "Charlie Goes America All Over Everybody's Ass",
             "10" : "Dennis and Dee Get a New Dad"}


x = int(input("Enter a season between 1 and 13 or 0 for random season: "))

print("You selected season:", x)

if x == 0:
    randomSeason = random.randint(1,13)
    print("Random season:", randomSeason)

    if randomSeason == 1:
        episode = random.randint(1,7)           
        print("Episode:", episode)

        if episode == 1:
            print(epTitles1["1"])
        elif episode == 2:
            print(epTitles1["2"])
        elif episode == 3:
            print(epTitles1["3"])
        elif episode == 4:
            print(epTitles1["4"])
        elif episode == 5:
            print(epTitles1["5"])
        elif episode == 6:
            print(epTitles1["6"])
        elif episode == 7:
            print(epTitles1["7"])

    if randomSeason == 2:
        episode = random.randint(1,10)           
        print("Episode:", episode)

        if episode == 1:
            print(epTitles2["1"])
        elif episode == 2:
            print(epTitles2["2"])
        elif episode == 3:
            print(epTitles2["3"])
        elif episode == 4:
            print(epTitles2["4"])

# same pattern continues for each season (13 seasons) 

Solo me gustaría aprender y comprender qué tipo de método / enfoque ayudaría a condensar mi código de una manera más práctica y cómo hacerlo.

2
mpt 9 may. 2019 a las 19:14

3 respuestas

La mejor respuesta

Almacene sus datos dentro de un dictado de dictados. Dict externo hace referencia a las estaciones, dict interno tiene el número de parte y el título de esta parte:

import random

# see below for a user input safe variant
def get_random_title_of_radnom_season(data):
    season = random.choice(list(data))   # replace with int numeric user input
    nr = random.choice(list(data))       # replace with int numeric user input
    title = data.get(season, {0:"does not exists"}.get(nr,0)    

    return f"Season {season} title {nr} was {title}"


# first index is the season, its value is a dict with partnr, title  
d = {1 : { a: f"Title {a}" for a in range(1,15) },
     2 : { a: f"Title {a}" for a in range(1,10) }, 
     3 : { a: f"Title {a}" for a in range(1,4)  } }

print(get_random_title_of_radnom_season(d))

Así es como se ven sus datos después de expandir las comprensiones dict:

{1: {1: 'Title 1',         2: 'Title 2',         3: 'Title 3',
     4: 'Title 4',         5: 'Title 5',         6: 'Title 6',
     7: 'Title 7',         8: 'Title 8',         9: 'Title 9',
     10: 'Title 10',      11: 'Title 11',       12: 'Title 12',
     13: 'Title 13',      14: 'Title 14'},
 2: {1: 'Title 1',         2: 'Title 2',         3: 'Title 3',
     4: 'Title 4',         5: 'Title 5',         6: 'Title 6',
     7: 'Title 7',         8: 'Title 8',         9: 'Title 9'},
 3: {1: 'Title 1',         2: 'Title 2',         3: 'Title 3'}}

Múltiples salidas:

Season 3 title 3 was Title 3    
Season 3 title 1 was Title 1    
Season 3 title 2 was Title 2    
Season 2 title 4 was Title 4    
Season 1 title 9 was Title 9

También puede considerar el uso de tuplas con nombre si no lo hace como diccionarios "desnudos".


Para que sea una prueba de entrada del usuario en lugar de usar randoms del dict:

def get_user_title_of_radnom_season(data, season, nr): 
    title = data.get(season, {}).get(nr,False)
    return f"Season {season} title {nr} was {title}" if title else "Does not exist"

print(get_user_title_of_radnom_season(d, 99, 99))

Imprimirá "Does not exist" para cualquier clave que no sea apropiada

2
Patrick Artner 9 may. 2019 a las 16:43

¡Gracias por todas las sugerencias! Pude acortarlo drásticamente al poner todos los episodios en un solo diccionario y usé tuplas como claves. Luego pude filtrar las claves en función de la entrada de los usuarios e imprimir la temporada y el título del episodio

0
mpt 10 may. 2019 a las 17:20

Puedes hacer tus diccionarios de esta manera

epTitles1 = {1:"s1ep1", 2:"s1ep2", 3:"s1ep3"}
epTitles1 = {1:"s2ep1", 2:"s2ep2", 3:"s2ep3"}

O incluso puede tener un único diccionario de listas (o lista de listas) para todas las estaciones

epTitles = { 1:["s1ep1", "s1ep2", "s1ep3"], 2:["s2ep1", "s2ep2", "s2ep3"] }

Entonces puedes acceder a ellas de esta manera.

print("You selected season:", x)
if x == 0:
    randomSeason = random.randint(1,13)
    print("Random season:", randomSeason)

    episode = random.randint(1,7)           
    print("Episode:", epTitles[randomSeason][episode-1])

También puede tener los rangos de episodios para la selección aleatoria guardados en un dict de tuplas para minimizar aún más el código, por lo que el código final será así

epTitles = { 1:["s1ep1", "s1ep2", "s1ep3"], 2:["s2ep1", "s2ep2", "s2ep3"] }
epRanges = { 1:(1,7), 2:(1,10) }

x = int(input("Enter a season between 1 and 13 or 0 for random season: "))
print("You selected season:", x)
if x == 0:
    randomSeason = random.randint(1,13)
    print("Random season:", randomSeason)

    episode = random.randint(epRanges[randomSeason][0], epRanges[randomSeason][1])           
    print("Episode:", epTitles[randomSeason][episode-1])
0
David Sidarous 9 may. 2019 a las 16:35