我将如何循环向字典添加值?

时间:2019-01-22 18:01:24

标签: python dictionary

我遇到了一个我很可能已经解决过的问题,但是却忘记了如何做。

我希望一个dict能够接受您扔给它的尽可能多的值,在我的情况下为4个值,并且不具有预期要解压缩的预定值限制。

我要运行的示例输入是:

2

USA Boston Pittsburgh Washington Seattle

UK London Edinburgh Cardiff Belfast

这是程序的小型调试版本。您输入int,然后输入那么多键及其各自的 one 值:

cNamesandCountries = dict()
n = int(input())
for i in range(n):
  user_input = input()
  key, value = user_input.split()
  cNamesandCountries[key] = value
print(cNamesandCountries)

我试图通过以下方法解决问题:

cNamesandCountries = dict()
n = int(input())
for i in range(n):
  user_input = input()
  key, value, value, value, value = user_input.split()
  cNamesandCountries[key] = value, value, value, value
print(cNamesandCountries)

但是我收到的输出是这样:

  

{'USA':('Seattle','Seattle','Seattle','Seattle'),'UK':('Belfast','Belfast','Belfast','Belfast')}

当然,这不应该发生。它使用输入的最后一个值,并将其用于dict中的每个值。我希望输出是这样:

  

{“美国” :(“波士顿”,“匹兹堡”,“华盛顿”,“西雅图”),“英国” :(“伦敦”,“爱丁堡”,“加的夫”,“贝尔法斯特”)}

我知道我可以通过将dict纳入代码中来解决这个问题,尽管在代码中输入了很多值,但是我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

问题在于在作业的左侧重复使用相同的value变量:

key, value, value, value, value = user_input.split()

将重新分配值,而您仅获得最后一个。

执行此操作:

cNamesandCountries = dict()
n = int(input())
for i in range(n):
  user_input = input()
  split_input = user_input.split()
  cNamesandCountries[split_input[0]] = split_input[1:]
print(cNamesandCountries)

让我们首先看看为什么初始代码不起作用。这种分配在左侧是变量列表,而在右侧是一个序列(列表和元组是序列的示例),有时也称为 sequence unpacking

它像这样工作。考虑示例:

a, b = (1+2, 2+3)

首先评估右侧,然后得到一个元组(3, 5),然后将从第一个元素开始的每个元素分配给左侧的相应变量。

可以(尽管不是很有用)多次指定相同的变量:

a, a = (2, 3)

在上述情况下,将为a分配2,然后立即为a分配3

让我们回到原始示例:

key, value, value, value, value = user_input.split()

在右侧,调用了字符串的split函数,该函数接收一个字符串并生成一个字符串列表:

>>> "USA Boston Pittsburgh Washington Seattle".split()
['USA', 'Boston', 'Pittsburgh', 'Washington', 'Seattle']

结果列表的第一个元素被分配给key变量。然后,所有其他元素依次从valueBoston分配给Seattle变量。请注意,每个分配覆盖 value变量的先前值。因此最终结果是value等于Seattle

然后,下一个操作将创建一个四个元素的元组,每个元素的值均为Seattle

('Seatle', 'Seatle', 'Seatle', 'Seatle')

并使用等于cNamesandCountries变量即key的值将其放入'USA'字典中。

该工作示例未使用序列拆包。它将拆分结果(即列表)分配给split_input变量。 然后,它使用其第一个元素(即USA)作为键,使用除第一个元素外的所有元素作为值。

表达式split_input[1:]是一个slice of the list,该操作的结果是一个新列表,该列表包含从索引1和索引2开始存储在split_input列表中的值。直到列表末尾:

>>> split_input="USA Boston Pittsburgh Washington Seattle".split()
>>> split_input[0]
'USA'
>>> split_input[1:]
['Boston', 'Pittsburgh', 'Washington', 'Seattle']

请注意,列表(和元组)具有从零开始的索引。