Ayuda del diccionario! Extraer valores y hacer una tabla.

Aquí está la pregunta que se supone que debo codificar para:

Escriba el contrato, la cadena de documentos y la implementación de una función showCast que toma un título de película e imprime los personajes con los actores / actrices correspondientes de la película dada en un orden alfabético de caracteres. Las columnas deben estar alineadas (20 caracteres (incluido el nombre del personaje) antes del nombre del actor / actriz.) Si no se encuentra la película, se imprime un mensaje de error.

Da un ejemplo de lo que se supone que sucede aquí.

>>> showCast("Harry Potter and the Sorcerer's Stone") Character Actor/Actress ---------------------------------------- Albus Dumbledore Richard Harris Harry Potter Daniel Radcliffe Hermione Granger Emma Watson Ron Weasley Rupert Grint >>> showCast('Hairy Potter') No such movie found 

Aquí hay otras funciones que he escrito para el mismo proyecto que probablemente serán de ayuda para responder la pregunta. Un resumen de lo que he tenido que hacer hasta ahora es que estoy creando un diccionario, llamado myIMDb, con una clave del título de la película y el valor de otro diccionario. En ese diccionario, esa clave es un personaje de una película, y el valor es el actor. Y he hecho cosas con eso. myIMDb es una variable global para el registro.

Otras funciones, lo que hacen es el docString.

 def addMovie (title, charList, actList): """The function addMovie takes a title of the movie, a list of characters, and a list of actors. (The order of characters and actors match one another.) The function addMovie adds a pair to myIMDb. The key is the title of the movie while the value is a dictionary that matches characters to actors""" dict2 = {} for i in range (0, len(charList)): dict2 [charList[i]] = actList[i] myIMDb[title] = dict2 return myIMDb 

He añadido tres películas,

 addMovie("Shutter Island", ["Teddy Daniels", "Chuck Aule"],["Leonardo DiCaprio, ","Mark Ruffalo"]) addMovie("Zombieland", ["Columbus", "Wichita"],["Jesse Eisenberg, ","Emma Stone"]) addMovie("O Brother, Where Art Thou", ["Everett McGill", "Pete Hogwallop"],["George Clooney, ","John Turturro"]) def listMovies(): """returns a list of titles of all the movies in the global variable myIMDb""" return (list(myIMDb.keys())) def findActor(title, name): """ takes a movie title and a character's name and returns the actor/actress that played the given character in the given movie. If the given movie or the given character is notfound, it prints out an error message""" if title in myIMDb: if name in myIMDb[title]: return myIMDb[title][name] else: return "Error: Character not in Movie" else: return "Error: No movie found" 

Ahora donde estoy teniendo problemas

Se supone que debo escribir la función showCast, pero estoy teniendo muchos problemas. He estado jugando con él por un tiempo, pero cuando llamo a myIMDb.values ​​() todo vuelve. Y parece que no puedo recorrerlo para clasificarlos y crear la tabla.

Esto es lo que he encontrado hasta ahora, pero no hace lo que esperaba. Solo espero que uno de ustedes pueda guiarme en la dirección correcta. (La región comentada es lo que estaba haciendo antes, solo para que pueda ver mi línea de pensamiento. [La impresión (alista) y la impresión (alista [0]) fue solo para confirmar que es una entrada grande en una lista, no separados en absoluto])

 def showCast(title): if title in myIMDb: actList=[] chList=[] aList = myIMDb[title] print (aList) """"for i in range (len(aList)): if i%2==0: chList.append(aList[i]) else: actList.append(aList[i]) print(chList) print(actList)"""" else: return "Movie not Found" 

Primero, no creo que addMovie devolver nada en la función addMovie . Simplemente agréguelo a la variable global:

 myIMDb = {} def addMovie (title, charList, actList): global myIMDb """The function addMovie takes a title of the movie, a list of characters, and a list of actors. (The order of characters and actors match one another.) The function addMovie adds a pair to myIMDb. The key is the title of the movie while the value is a dictionary that matches characters to actors""" dict2 = {} for i in range (0, len(charList)): dict2 [charList[i]] = actList[i] myIMDb[title] = dict2 

Aunque no recomiendo usar variables globales a menudo, creo que en este caso es perdonable: D

Después de eso, en tu función showCast , usaría esto:

 def showCast(title): if title in myIMDb: actList=[] chList=[] movie = myIMDb[title] for character, cast in movie.keys(), movie.values(): #grab the character from #the keys, and cast from the values. chList.append(character) actList.append(cast) print (chList, actList) else: return "Movie not Found" 

Aquí está mi salida:

 ['Columbus', 'Jesse Eisenberg, '] ['Wichita', 'Emma Stone'] 

¡Está funcionando como se espera, espero que esto ayude!

Quizás estos fragmentos te ayuden a:

Imprimir una fila de la tabla

 def printRow(character, actor): print(character + (20 - len(character)) * ' ' + actor)) 

Ordenando los personajes

 def getSortedTitleList(titleList): sortedList = [] characters = sorted(titleList) for character in characters: sortedList.append((character, titleList[character])) return sortedList 

Nota: Cambié dict.keys().sort() a sorted(dict) para ser compatible con Python 3.