测试用户输入的嵌套字典并检索直接相关的信息
Testing nested dictionaries for a user input and retrieving directly related information
我是 Python 3 的新手,一直在尝试使用字典,但我在测试特定键并从嵌套字典中检索其相关值时遇到问题。
我想根据嵌套词典检查用户定义的输入,如果找到用户输入,我想收集该项目的详细信息并将其添加到另一个词典。
例如
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
userQuery = input("What food do you want to check for? ")
userQuery = "Apple"
想要的结果:
basketDict = {"Fruit": {"Apple": "2"}}
我尝试使用字典理解来形成一个仅包含食物(苹果、香蕉、生菜等)的新字典,但在尝试收集相关类别时 运行 仍然存在问题("Fruit"/"Vegetable" 和嵌套词典中的数量信息。
这是我的(损坏的)代码:
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
shopCheck = []
userQuery = input("What food do you want to check for? ")
for category, food in shopDict.items():
for each in food:
shopCheck.append(each)
if userQuery not in shopCheck:
print("That's not available.")
else:
print(userQuery + " added to basket. ")
basketDict[category] = [food]
print(basketDict)
我首先创建一个字典,其中包含您可以购买的所有物品,无论是水果还是蔬菜。然后我会简单地检查所需的项目是否在该词典中:
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
allVals = {}
for k, subDict in shopDict.items():
for k1, val in subDict.items():
allVals[k1] = val
userQuery = input("What food do you want to check for? ")
if userQuery not in allVals.keys():
print("That's not available.")
else:
print(userQuery + " added to basket. ")
basketDict[userQuery] = allVals[userQuery]
print(basketDict)
可能有更简单的方法来执行此操作,但我只是修复了您的代码。
当我 运行 你的代码时,shopDict
中的所有内容都会变成 basketDict
。这是因为您没有在每次 for
迭代时清理 shopCheck
变量。
在向 basketDict
添加元素时出现了第二个错误。您只需添加与 userQuery
匹配的 food
元素。这是完整的固定代码:
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
userQuery = input("What food do you want to check for? ")
for category, food in shopDict.items():
shopCheck = []
for each in food:
shopCheck.append(each)
if userQuery not in shopCheck:
print("That's not available.")
else:
print(userQuery + " added to basket. ")
basketDict[category] = {userQuery:food[userQuery]}
print(basketDict)
此代码足以满足您的要求:
for category, food in shopDict.items():
if userQuery in food:
basketDict[category] = {userQuery: food[userQuery]}
但是如果您想将新商品添加到购物车,您应该适当更新它:
for category, food in shopDict.items():
if userQuery in food:
basketDict.update(
{category: {**basketDict.get(category, {}),
**{userQuery: food[userQuery]}}}
)
您想将类别的实际字典(购物篮的实际内容)与所选项目的键值合并。
通常在 python3 中,如果你有 2 个词典,这是将它们合并为一个的方法:
d1 = {"one": 1, "two": 2}
d2 = {"three": 3}
merged = {**d1, **d2} # {'one': 1, 'two': 2, 'three': 3}
因为**
是用来解压字典的
理解它的好方法是,如果您有一个带有一些参数的函数定义,那么您可以使用以参数名称作为键的字典来调用该函数。但是你必须解压它,否则你会将字典作为参数传递,而不是它的值。
d = {"one": 1, "two": 2}
def example(one, two):
pass
example(d)
会抛出 TypeError,因为它缺少第二个位置参数,但 example(**d)
可以正常工作
我是 Python 3 的新手,一直在尝试使用字典,但我在测试特定键并从嵌套字典中检索其相关值时遇到问题。
我想根据嵌套词典检查用户定义的输入,如果找到用户输入,我想收集该项目的详细信息并将其添加到另一个词典。
例如
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
userQuery = input("What food do you want to check for? ")
userQuery = "Apple"
想要的结果:
basketDict = {"Fruit": {"Apple": "2"}}
我尝试使用字典理解来形成一个仅包含食物(苹果、香蕉、生菜等)的新字典,但在尝试收集相关类别时 运行 仍然存在问题("Fruit"/"Vegetable" 和嵌套词典中的数量信息。
这是我的(损坏的)代码:
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
shopCheck = []
userQuery = input("What food do you want to check for? ")
for category, food in shopDict.items():
for each in food:
shopCheck.append(each)
if userQuery not in shopCheck:
print("That's not available.")
else:
print(userQuery + " added to basket. ")
basketDict[category] = [food]
print(basketDict)
我首先创建一个字典,其中包含您可以购买的所有物品,无论是水果还是蔬菜。然后我会简单地检查所需的项目是否在该词典中:
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
allVals = {}
for k, subDict in shopDict.items():
for k1, val in subDict.items():
allVals[k1] = val
userQuery = input("What food do you want to check for? ")
if userQuery not in allVals.keys():
print("That's not available.")
else:
print(userQuery + " added to basket. ")
basketDict[userQuery] = allVals[userQuery]
print(basketDict)
可能有更简单的方法来执行此操作,但我只是修复了您的代码。
当我 运行 你的代码时,shopDict
中的所有内容都会变成 basketDict
。这是因为您没有在每次 for
迭代时清理 shopCheck
变量。
在向 basketDict
添加元素时出现了第二个错误。您只需添加与 userQuery
匹配的 food
元素。这是完整的固定代码:
basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
"Vegetables": {"Lettuce": "5", "Potato": "7"}}
userQuery = input("What food do you want to check for? ")
for category, food in shopDict.items():
shopCheck = []
for each in food:
shopCheck.append(each)
if userQuery not in shopCheck:
print("That's not available.")
else:
print(userQuery + " added to basket. ")
basketDict[category] = {userQuery:food[userQuery]}
print(basketDict)
此代码足以满足您的要求:
for category, food in shopDict.items():
if userQuery in food:
basketDict[category] = {userQuery: food[userQuery]}
但是如果您想将新商品添加到购物车,您应该适当更新它:
for category, food in shopDict.items():
if userQuery in food:
basketDict.update(
{category: {**basketDict.get(category, {}),
**{userQuery: food[userQuery]}}}
)
您想将类别的实际字典(购物篮的实际内容)与所选项目的键值合并。 通常在 python3 中,如果你有 2 个词典,这是将它们合并为一个的方法:
d1 = {"one": 1, "two": 2}
d2 = {"three": 3}
merged = {**d1, **d2} # {'one': 1, 'two': 2, 'three': 3}
因为**
是用来解压字典的
理解它的好方法是,如果您有一个带有一些参数的函数定义,那么您可以使用以参数名称作为键的字典来调用该函数。但是你必须解压它,否则你会将字典作为参数传递,而不是它的值。
d = {"one": 1, "two": 2}
def example(one, two):
pass
example(d)
会抛出 TypeError,因为它缺少第二个位置参数,但 example(**d)
可以正常工作