繁体   English   中英

测试嵌套词典以获取用户输入并检索直接相关的信息

[英]Testing nested dictionaries for a user input and retrieving directly related information

我是Python 3的新手,并且一直在尝试使用Dictionary,但是在测试特定键并从嵌套字典中检索其相关值时遇到了问题。

我希望根据嵌套词典检查用户定义的输入,如果找到了用户输入,那么我想收集该项目的详细信息并将其添加到另一个字典中。

例如

basketDict = {}
shopDict = {"Fruit": {"Apple": "2", "Banana": "3"},
             "Vegetables": {"Lettuce": "5", "Potato": "7"}}
userQuery = input("What food do you want to check for? ")

userQuery =“苹果”

所需结果:

basketDict = {"Fruit": {"Apple": "2"}}

我尝试使用字典理解来形成仅食品(苹果,香蕉,生菜等)的新字典,但是在尝试从中收集相关类别(“水果” /“蔬菜”)和数量信息时遇到了问题嵌套字典。

这是我的代码(断开):

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 这是因为你没有清洗你的shopCheck在每个变量for迭代。 在将元素添加到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)可以正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM