Неполный словарь, построенный с использованием функций и цикла while - PullRequest
0 голосов
/ 22 февраля 2019

Я написал код для использования функции и цикл while для ввода данных пользователем для заполнения словаря.К сожалению, мой код только принимает последнюю пару ключ: значение, введенную пользователем.Я надеялся, что при запуске кода появятся несколько пар ключ: значение.

Я довольно новичок в Python и был бы признателен, если бы мои ошибки были выделены.Спасибо.

пс: см. Код ниже

def make_album(artist_name,album_title):
    """Return a dictionary of information about album."""
    album_details_1 = {'name': artist_name, 'title': album_title}

    return album_details_1


while True:
    print("\nPlease tell me the name of your favourite artist:")

    art_name =input("artist name: ")         

    alb_title=input("album title: ")

    repeat = input("Would you like to enter another response? (yes/no) ")
    if repeat == 'no':
        break



musician_1 = make_album(art_name, alb_title)


print(musician_1)

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Проблема заключается в том, что цикл while просит пользователя вводить исполнителя и название альбома каждую итерацию, но он ничего не делает с этой информацией.Он просто спрашивает пользователя снова и снова, пока он не скажет «нет».Только тогда словарь создается из пары «последний исполнитель - альбом».

Когда вы говорите, что хотите иметь несколько пар «ключ-значение», вы уже это делаете.Если я запускаю программу и ввожу имя исполнителя "freddy" и альбом "my_album", я получаю:

Please tell me the name of your favourite artist:
artist name: freddy
album title: my_album
Would you like to enter another response? (yes/no) no
{'title': 'my_album', 'name': 'freddy'}

Обратите внимание, что у меня есть ключ "title" со значением "my_album" и ключ "name""со значением" Фредди ".Таким образом, есть 2 пары ключ-значение.

Когда вы сказали, что хотите иметь несколько пар ключ-значение, я предполагаю, что вы хотите отслеживать нескольких исполнителей и пары имен альбомов.Если это так, лучший способ сделать это в Python - использовать кортеж.Вы можете иметь ('freddy','my_album') в качестве кортежа.Используя кортеж, вам не нужно иметь никаких ключей.Вместо этого позиция каждого элемента говорит вам, что это означает.В этом случае первый элемент кортежа - это имя исполнителя, а второй - имя альбома.

Затем, используя кортежи, вы можете получить их список для отслеживания всего исполнителя, альбома.пары:

def make_album(artist_name,album_title):
  """Return a tuple of information about album."""
  return (artist_name, album_title)

all_tuples = []
while True:
  print("\nPlease tell me the name of your favourite artist:")

  art_name =input("artist name: ")

  alb_title=input("album title: ")

  musician = make_album(art_name, alb_title)
  all_tuples.append(musician)

  repeat = input("Would you like to enter another response? (yes/no) ")
  if repeat == 'no':
    break

print(all_tuples)

Вам даже не нужна функция для создания кортежа: musician = (art_name, alb_title)

или, еще лучше, all_tuples.append((art_name,alb_title))

0 голосов
/ 22 февраля 2019

Причина, по которой вы получаете только одну пару ключ: значение, заключается в том, что каждый раз, когда вы запускаете цикл, вы переопределяете переменные.Вы можете использовать простой список, чтобы собрать всех музыкантов и распечатать его в конце:

def make_album(artist_name,album_title):
    """Return a dictionary of information about album."""
    album_details_1 = {'name': artist_name, 'title': album_title}

    return album_details_1

musicians = []  # list of musicians

while True:
    print("\nPlease tell me the name of your favorite artist:")

    art_name =input("artist name: ")         
    alb_title=input("album title: ")
    musicians.append(make_album(art_name, alb_title))  # add the new musicians to list

    repeat = input("Would you like to enter another response? (yes/no) ")
    if repeat.lower() == 'no':
        break


print(musicians)

Вывод:

Please tell me the name of your favorite artist:
artist name: 1
album title: 1
Would you like to enter another response? (yes/no) yes

Please tell me the name of your favorite artist:
artist name: 2
album title: 2
Would you like to enter another response? (yes/no) no
[{'name': '1', 'title': '1'}, {'name': '2', 'title': '2'}]

Обратите внимание, что я использовал repeat.lower() для проверки ввода,таким образом ваша программа остановится независимо от регистра строки (NO / No / nO / no).

...