Печать таблицы из словаря

Вот вопрос, для которого я должен кодировать:

Напишите контракт, строку документации и реализацию для функции showCast, которая берет заголовок фильма и печатает символы с соответствующими актерами / актрисами из данного фильма в алфавитном порядке символов. Столбцы должны быть выровнены (20 символов (включая имя персонажа) перед именем актера / актрисы.) Если фильм не найден, выводится сообщение об ошибке.

Это дает пример того, что должно произойти здесь

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

Вот другие функции, которые я написал для того же проекта, которые, вероятно, помогут ответить на вопрос. Сводка того, что я должен был сделать до сих пор, заключается в том, что я создаю словарь myIMDb с ключом названия фильма и значением другого словаря. В этом словаре этот ключ является персонажем фильма, а значение - актером. И я с этим покончил. myIMDb - это глобальная переменная для записи.

Другие функции, которые они делают, это 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

Я добавил три фильма,

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"

Теперь, где у меня проблемы

Я должен написать функцию showCast, но у меня много проблем. Я возился с этим некоторое время, но когда я вызываю myIMDb.values ​​(), все возвращается. И я не могу, кажется, перебрать его, чтобы отсортировать их для создания таблицы.

Вот что я придумала до сих пор, но это не делает то, на что я надеялась. Я просто надеюсь, что один из вас сможет направить меня в правильном направлении. (Закомментированная область - это то, что я делал раньше, просто чтобы вы могли видеть мой ход мыслей. [Print (alist) и print(alist[0]) были просто для того, чтобы подтвердить, что это одна большая запись в списке, а не отделены на всех])

def showCast(title):

    if title in myIMDb:
        actList=[]
        chList=[]
        aList = list(myIMDb.values())
        print (aList)
        print (aList[0])
          """"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 ответ

Это старый вопрос, но я сделаю удар. Я думаю, что ваша путаница происходит от вложенной природы объекта myIMDb. Чтобы получить информацию о конкретных фильмах, вы должны использовать заголовок в качестве ключа к myIMDb, например myIMDb[title], То, что вы получите, - это еще один словарь, который вы затем сможете использовать для получения пар "ключ / символ".

Вот рабочая версия функции showCast:

def showCast(title):

    if title in myIMDb:
        print("{0:20} {1:20}".format("Character", r"Actor/Actress"))
        print("-"*40)
        for character, actor in myIMDb[title].items():
            print("{0:20} {1:20}".format(character, actor))
    else:
        return "Movie not Found"

Первый оператор print генерирует заголовок и использует метод строки формата Python, чтобы получить желаемый выровненный интервал. Следующим оператором print является делитель, а затем ядро ​​функции просто перебирает пары с циклом for.

Надеюсь, это поможет.

Другие вопросы по тегам