Тестирование вложенных словарей для пользовательского ввода и получение непосредственно связанной информации - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в 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"}}

Я пытался использовать словарное понимание, чтобы сформировать новый словарь только для продуктов питания (яблоко, банан, салат и т. Д.), Но продолжаю сталкиваться с проблемами при попыткесобрать связанную категорию ("Фрукты" / "Овощи" и информацию о количестве из вложенных словарей.

Вот мой (неработающий) код:

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)

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Возможно, есть более простой способ сделать это, но я только исправил ваш код.Когда я запускаю твой код, все внутри shopDict собиралось basketDict.Это потому, что вы не чистили переменную shopCheck на каждой итерации for.И была вторая ошибка при добавлении элементов в basketDict.Вам нужно добавить только элемент food, который соответствует userQuery.Вот полный фиксированный код:

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)
0 голосов
/ 12 ноября 2018

Этого кода достаточно для ваших требований:

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) будет работать нормально

0 голосов
/ 12 ноября 2018

Я бы начал с создания словаря, содержащего все предметы, которые вы можете купить, будь то фрукты или овощи.Тогда я бы просто проверил, есть ли в этом словаре нужный элемент:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...