Оператор In не работает при вводе переменной и работает при присвоении значения - PullRequest
0 голосов
/ 18 июня 2020

Итак, у меня есть файл yaml. Я пытаюсь извлечь из этого ценности. В настоящее время я не l oop и получаю нужные мне значения, я сделаю это, когда проблема будет решена. Но он не может найти ключ, когда я ввожу переменную, которую хочу использовать. в противном случае он работает.

import yaml
f = open(path)
blueprints = yaml.load(f, Loader=yaml.FullLoader)
id = 682

if (id in blueprints) == True:
    act = input("\ncopying\ninvention\nproducts\nskills\nmanufacturing\nActivity: ")
    if (act in blueprints[id]["activities"] == True):
        print(blueprints[id]["activities"][act])
    else:
        print("could not find the activity")
else:
    print("could not find id")

Таким образом, вывод будет «не удалось найти действие», что означает, что первый оператор in работает, а второй - нет. Я попытался сделать прямо противоположное, введя первую переменную «id» вместо «act», но это тоже не сработало. И да, я превратил переменную id в целое число. Файл yaml слишком велик, но вот его часть:

681:
    activities:
        copying:
            time: 480
        manufacturing:
            materials:
            -   quantity: 86
                typeID: 38
            products:
            -   quantity: 1
                typeID: 165
            time: 600
        research_material:
            time: 210
        research_time:
            time: 210
    blueprintTypeID: 681
    maxProductionLimit: 300
682:
    activities:
        copying:
            time: 480
        manufacturing:
            materials:
            -   quantity: 133
                typeID: 38
            products:
            -   quantity: 1
                typeID: 166
            time: 600
        research_material:
            time: 210
        research_time:
            time: 210
    blueprintTypeID: 682
    maxProductionLimit: 300

Я все еще новичок в python, и мне не у кого спросить, пока я учусь сам. Прошу прощения, если решение простое.

1 Ответ

0 голосов
/ 18 июня 2020

Вот необходимые изменения, см. Комментарии. Образец здесь :

import yaml
# f = open(path)
with open('data.yaml', 'r') as f:   # change to use with context manager which will handle file closing
                                    # Just change 'data.yaml', remember to indent the block.
  blueprints = yaml.load(f, Loader=yaml.FullLoader)
  id_no = 682                       # change to use id_no
                                    # id is a built in function you don't want to overwrite.

  if id_no in blueprints:           # Remove the superfluous == True
      act = input("\ncopying\ninvention\nproducts\nskills\nmanufacturing\nActivity: ")
      if act in blueprints[id_no]["activities"]:  # Remove the erroneous == True, which causes your result to fail
          print(blueprints[id_no]["activities"][act])
      else:
          print("could not find the activity")
  else:
      print("could not find id")

Тестовый прогон:

copying
invention
products
skills
manufacturing
Activity: copying
{'time': 480}

Примечание: помните, что ваш input (act) должен точно совпадать с вашими ключами в activities с учетом регистра. В противном случае вы захотите преобразовать случаи для сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...