当我运行代码时,我收到他的错误KeyError:'553'


import random
data_bid = {}
n = 2
uniq_no = random.randint(101, 1000)
print(f"Bid NO. :{uniq_no} ")
name = input("Name: ")
phone = input("Phone Number: ")
while len(phone) != 10:
print("<<<<<<-----------Please Enter Valid Data---------->>>>>>")
phone = input("Phone Number: ")
bid_amount = float(input("Enter The Bid amount $: "))
for num in range(1, n):
data_bid[f"{uniq_no}"]["name"] = name
data_bid[f"{uniq_no}"]["phone"] = phone
data_bid[f"{uniq_no}"]["bid amount"] = bid_amount

当我运行代码时,我得到KeyError: '553'

我无法解决它,我想存储我的数据

data_bid = {"uniq_no" ={"name" = name, "phone" = phone}}

我想把数据存储在嵌套字典中。

为了有一个嵌套的字典,您需要每个新的uniq_no都有一个初始化为其值的字典。您可以通过为每个新的uniq_no:初始化一个字典来实现这一点

data_bid[uniq_no] = {}

然而,实现这一点的Python方法是使用defaultdict:

import random
from collections import defaultdict
data_bid = defaultdict(dict)
n = 2
uniq_no = random.randint(101, 1000)
print(f"Bid NO. :{uniq_no} ")
name = input("Name: ")
phone = input("Phone Number: ")
while len(phone) != 10:
print("<<<<<<-----------Please Enter Valid Data---------->>>>>>")
phone = input("Phone Number: ")
bid_amount = float(input("Enter The Bid amount $: "))
for num in range(1, n):
data_bid[uniq_no]["name"] = name
data_bid[uniq_no]["phone"] = phone
data_bid[uniq_no]["bid amount"] = bid_amount

引用python的文档:

defaultdict返回一个新的类似字典的对象。defaultdict为内置CCD_ 8类的子类。它覆盖一个方法,并且添加一个可写实例变量。剩下的功能是与CCD_ 9相同。

此外,我不明白为什么要将字典键设置为字符串。您可以使用原始整数值。

您也需要初始化嵌套字典。否则,当您尝试在嵌套字典上设置值时,它将抛出一个错误。

我不知道你为什么要把字典键设置为字符串。你注意到你可以直接使用整数吗?

import random
data_bid = {}
n = 2
uniq_no = random.randint(101, 1000)
data_bid[uniq_no] = {} # create the nested dictionary 
print(f"Bid NO. :{uniq_no} ")
name = input("Name: ")
phone = input("Phone Number: ")
while len(phone) != 10:
print("<<<<<<-----------Please Enter Valid Data---------->>>>>>")
phone = input("Phone Number: ")
bid_amount = float(input("Enter The Bid amount $: "))
for num in range(1, n):
data_bid[uniq_no]["name"] = name # Save the values on the nested dictionary
data_bid[uniq_no]["phone"] = phone
data_bid[uniq_no]["bid amount"] = bid_amount

当然,您可以保留f"{uniq_no}",并使用字符串代替int

...
data_bid[f"{uniq_no}"] = {}
...
for num in range(1, n):
data_bid[f"{uniq_no}"]["name"] = name
data_bid[f"{uniq_no}"]["phone"] = phone
data_bid[f"{uniq_no}"]["bid amount"] = bid_amount

我同意@eyal-golan的观点,可能会自己使用collections.defaultdict(dict),不过我想我会展示一个使用setdefault()的简单替代方案。这是对您当前代码的一行添加:

import random
data_bid = {}
n = 2
uniq_no = random.randint(101, 1000)
print(f"Bid NO. :{uniq_no} ")
name = input("Name: ")
phone = input("Phone Number: ")
while len(phone) != 10:
print("<<<<<<-----------Please Enter Valid Data---------->>>>>>")
phone = input("Phone Number: ")
bid_amount = float(input("Enter The Bid amount $: "))
## ---------------------------
## if this key is not in the dictionary add it with a value of an
## empty dictionary.
## ---------------------------
data_bid.setdefault(f"{uniq_no}", {})
## ---------------------------
for num in range(1, n):
data_bid[f"{uniq_no}"]["name"] = name
data_bid[f"{uniq_no}"]["phone"] = phone
data_bid[f"{uniq_no}"]["bid amount"] = bid_amount
print(data_bid)

最新更新