使用函数和while循环构建的不完整字典列表

时间:2019-02-21 21:09:13

标签: python function dictionary while-loop

我已经编写了一个代码来使用一个函数和一个while循环来使用用户输入来填充字典。不幸的是,我的代码似乎只接受用户输入的最后一个key:value对。我希望的是在运行代码时出现多个key:value对。

我是Python的新手,不胜感激我将不胜感激。谢谢。

ps:请参见下面的代码

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 :(得分:0)

之所以只获得一个key:value对,是因为每次运行循环时,您都将覆盖变量。您可以使用一个简单的列表来累积所有音乐家并在最后打印出来:

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)而停止。

答案 1 :(得分:0)

问题在于,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'}

请注意,我有一个值为“ my_album”的键“ title”和一个值为“ freddy”的键“ 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))