Фильтрация результатов из списков Python - PullRequest
0 голосов
/ 22 марта 2019

Я пытался найти ответ по сети без каких-либо результатов. Я пытаюсь создать систему, в которой пользователь может искать в списках и возвращать свои предметы и оценки, с фильтром, чтобы показать предметы только из одной области (например, информатика), а также фильтрует уровень предмета (если это 100lvl, 200lvl или 300lvl) Я пытался с Sub_string, но не работает должным образом. Итак, код представления, который у меня есть (с sub_string), таков:

def finn():
    global Karakterer
    global Emner
    print("Velg fag og/eller emnenivå (<enter> for alle)")
    Fag = input("-Fag: ")
    for sub_string in Emner:
        if str(Fag) in sub_string:
         print(*([sub_string] + ([Karakterer[sub_string]] if sub_string in Karakterer else [])))

это мои списки (конвертированные в Dicts для работы)

Emner = ["INFO100","INFO104","INFO110","INFO150","INFO125", "RELV102"]
FagKoder = [["Informasjonsvitenskap","INF"],["Kognitiv vitenskap","Kog"], 
["Religionsvitenskap","REL"],["DigitalKultur","DIK"],["Økonomi","ECO"]]
Karakterer=[["INFO100","C"],["INFO104","B"],["INFO110","E"], ["RELV102","A"]]
Karakterer=dict(Karakterer)
FagKoder = dict(FagKoder)

Вот как это распечатывается сейчас, и как мне нужно, чтобы это было напечатано:

enter image description here

Моя проблема в том, что Sub_string dosent работает должным образом для того, что мне нужно, потому что мне нужно иметь возможность позволить пользователю выбрать область (например, INFO), а также специальный уровень (уровень 200), а затем распечатать все ИНФО предметы на уровне 200. Но только sub_string проверяет, содержится ли строка в списке, и печатает ее. У кого-нибудь есть лучшее решение? надеюсь, что это имеет смысл Спасибо!

1 Ответ

1 голос
/ 22 марта 2019

Минимальное исправление может состоять в том, чтобы отделить число от конца и сравнить его отдельно.

def finn():
    global Karakterer  # ugh
    global Emner       # ugh
    want_subj = input("Velg fag (<enter> for alle): ")
    want_level = input("Velg emnenivå (<enter> for alle): ")
    try:
        want_level = int(want_level)
    except ValueError:
        want_level = None
    for subject in Emner:
        # no need for str(Fag); input by definition returns a string
        if want_subj in subject:
          if not want_level or int(subject[-3:]) == want_level:
            print(*([sub_string] + ([Karakterer[sub_string]] if sub_string in Karakterer else [])))

Лучшим решением может быть сохранение курсов и их уровня в виде отдельных элементов, чтобы вам не приходилось анализировать число, когда вам это нужно. (Кроме того, вам не следует присваивать списку, а затем преобразовывать его в dict, если вы можете легко определить dict напрямую.)

Emner = [("INFO",100),("INFO",104),("INFO",110),("INFO",150),("INFO",125, ("RELV",102)]
FagKoder = {
    "INF": "Informasjonsvitenskap",
    "Kog": "Kognitiv vitenskap",
    "REL": "Religionsvitenskap",
    "DIK": "DigitalKultur"
    "ECO": "Økonomi"
    }

Должно быть достаточно очевидно, как адаптировать код для работы с этими структурами.

(Кстати, у вас, похоже, есть "RELV" в Emner, но "REL" в FagKoder.)

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