Dictionary Help! Extracting values and making a table

非 Y 不嫁゛ 提交于 2019-12-02 18:01:32

问题


Here's the question that I'm supposed to code for:

Write the contract, docstring and implementation for a function showCast that takes a movie title and prints out the characters with corresponding actors/actresses from the given movie in an alphabetical order of characters. The columns must be aligned (20 characters (including the character's name) before the name of the actor/actress.) If the movie is not found, it prints out an error message.

It gives an example of what's supposed to happen here

>>> 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

Here are other functions that I've written for the same project that will probably be of assistance in answering the question. A summary of what I've had to do so far is that I'm creating a dictionary, called myIMDb, with a key of the title of the movie, and the value another dictionary. In that dictionary that key is a character of a movie, and the value is the actor. And I've done stuff with it. myIMDb is a global variable for the record.

Other functions, what they do is the 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

I've added three movies,

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"

Now where I'm having trouble

I'm supposed to write the showCast function, but I'm having a lot of trouble. I've been tinkering with it for a while but when I call myIMDb.values() everything returns. And I can't seem to loop through it to sort them to create the table.

Here's what I've come up with so far, but it doesn't do what I was hoping. I'm just hoping that one of you can steer me in the right direction. (The commented out region is what I was doing before, just so you can see my train of thought. [the print(alist) and print(alist[0]) was just to confirm that it's one big entry in a list, not separated at all])

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"

回答1:


First, i don't think you should return anything in the addMovie function. Just simply add it to the global variable:

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

Although i don't recommend to use global variables often, i think it's forgivable in this case :D

After that, in your showCast function, i'd use this:

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"

Here's my output:

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

It's working as expected, hope this helps!




回答2:


Maybe these snippets help you:

Printing a table row

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

Sorting the characters

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

Note: I changed dict.keys().sort() to sorted(dict) to be compatible with Python 3.



来源:https://stackoverflow.com/questions/19578701/dictionary-help-extracting-values-and-making-a-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!