我遇到了一个我很可能已经解决过的问题,但是却忘记了如何做。
我希望一个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纳入代码中来解决这个问题,尽管在代码中输入了很多值,但是我不知道该怎么做。
答案 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
变量。然后,所有其他元素依次从value
到Boston
分配给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']
请注意,列表(和元组)具有从零开始的索引。