如何在使用while循环时将值附加到字典中的列表?

Posted

技术标签:

【中文标题】如何在使用while循环时将值附加到字典中的列表?【英文标题】:How to append values to a list in a dictionary while using a while loop? 【发布时间】:2020-12-04 14:22:20 【问题描述】:
vacation_poll = 

name_prompt = "\nWhat is your name? "
vacation_spot_prompt = "\nWhere would you like to go on vacation? "
repeat_prompt = "\nWould you like to continue? (yes/no) "

active = True
while active:
    name = input(name_prompt)
    vacation_spot = input(vacation_spot_prompt)
    vacation_poll[name] = [vacation_spot]
    repeat = input(repeat_prompt)
    if repeat == 'no':
        active = False

for name, spots in vacation_poll.items():
    print("\nThese are " + name.title() + "'s places of interest: ")
    for spot in spots:
        print("\t" + spot.title())

print(vacation_poll)

我的目标是当相同的键出现时,在字典假期投票中的列表中添加一个新的度假地点。因此,如果在我继续循环后 Joe 再次出现,新的度假地点应该添加到 Joe 的度假地点列表中,但我却将其覆盖。我尝试使用 for 循环追加,但这也不起作用。每次循环继续时,如何修复它以将新值附加到列表中?

【问题讨论】:

【参考方案1】:

您是否考虑过要用于字典的架构?从您的代码来看,您似乎正在尝试做类似的事情

vacation_poll = 
    'Bob': ['Fiji', 'Florida', 'Japan'],
    'Joe': ['Disney Land', 'Six Flags', 'Lego Land']

当我处理这类问题时,通常我所做的是设置一个 if 语句来检查字典中是否尚不存在该键,如果不存在,则使用列表对其进行初始化:

if name not in vacation_poll:
    vacation_poll[name] = []

这让我不必担心该列表是否在我的代码中稍后不存在,我可以执行类似的操作

vacation_poll[name].append(vacation_spot)

因为在我将与name 关联的值初始化为一个列表之后,我可以指望那里有一个列表。

在您的情况下,您可能会考虑使用集合而不是列表,因为它只强制存储唯一值。这样,如果用户两次输入相同的值,即使第二次再次插入,它也只会记录一次。

【讨论】:

我刚试过这个,因为这是我想做的事情,但我收到一个错误:“TabError:缩进中制表符和空格的使用不一致”vacation_poll = active = True while活动:名称=输入(名称提示)假期点=输入(假期点提示)如果名称不在假期轮询中:假期轮询[名称]=[]假期轮询[名称].append(假期点)重复=输入(重复提示)如果重复==“否”: active = False 也许我放错了?我不得不剪掉一些代码来回复你。 Python 希望所有缩进都使用制表符或空格(通常是 4 个空格)来完成。如果有些缩进是用制表符完成的,有些是用空格完成的(比如你从堆栈溢出复制的代码),那么 python 会感到困惑。如果您使用的是 notepad++ 或 Visual Studio Code 之类的编辑器,它们通常会有一个菜单项,可以将所有缩进转换为仅制表符或仅空格。【参考方案2】:

您需要使用一种追加到列表的形式。但是,您不能只使用以下之一:

vacation_poll[name]+=[vacation_spot]
vacation_poll[name].append(vacation_spot)

这样做会引发错误,因为当一个人的第一个度假地点被添加时,字典中没有以他们的名字为索引的值。而是需要 get(index, default) 方法。

vacation_poll[name]=vacation_poll.get(name, [])+[vacation_spot]

这将根据需要。当 key 还没有在字典中时,get() 会返回第二个参数,默认值,在这种情况下是一个空列表。

【讨论】:

以上是关于如何在使用while循环时将值附加到字典中的列表?的主要内容,如果未能解决你的问题,请参考以下文章

Bash将值附加到for循环内的列表中

将字典附加到循环中的列表

使用 for 循环有没有办法控制哪个 # 循环将值附加到列表中?

如何在实例化时将值插入 C# 字典?

在 setdefault 之后附加到字典中的列表 [重复]

如何将值列表附加到数据框中的列表列