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)