Редактирование списка словарей из списка, созданного из txt файла

Я пытаюсь исключить и удалить некоторые словари из списка. Я некоторое время искал на сайте и не нашел ничего особенного по этому поводу. Список словарей был создан из текстового файла, расположенного по адресу: http://s000.tinyupload.com/?file_id=48953557772434487729

Я пытаюсь отсортировать и исключить то, что мне не нужно. Я думал, что мой синтаксис правильный, но, видимо, нет.

Я включил только необходимый код, чтобы уменьшить беспорядок. У меня проблемы с точкой action_genre и с исключением и удалением там словарей. При появлении запроса введите «s», а затем «a», чтобы получить доступ к этим двум меню.

def load_movies():
    global movies_list
    movies_list= []
    file_ref = open("movies.txt", 'r')
    line = file_ref.readline()
    for line in file_ref:
        line = line.strip()
        current = {}
        if line == '':
            break
        movie_data = line.split("\t")
        current["title"] = movie_data[0]
        current["year"] = movie_data[1]
        current["length"] = movie_data[2]
        current["rating"] = movie_data[3]
        current["action"] = int(movie_data[4][0]) == 1
        current["animation"] = int(movie_data[4][1]) == 1
        current["comedy"] = int(movie_data[4][2]) == 1
        current["drama"] = int(movie_data[4][3]) == 1
        current["documentary"] = int(movie_data[4][4]) == 1
        current["romance"] = int(movie_data[4][5]) == 1
        movies_list.append(current)
        del current
    file_ref.close()


def menu():
    movie_selector =("Movie Selector - Please enter an option below:\nL - List all movies\nY - List all movies by year\n"
                "T - Search by title\nS - Search by genre, rating, and maximum length\nQ - Quit the program\nOption:")
    movie_selector_input = input(movie_selector).upper()

    if movie_selector_input == "L":
        list_movies()
    if movie_selector_input == "Y":
        list_by_year()
    if movie_selector_input == "T":
        search_by_title()
    if movie_selector_input == "S":
        search()
    if movie_selector_input == "Q":
        print("Thanks for using my program! Goodbye.")
        exit()
else:
    print("Invalid input")
    print("Please try again")
    print()
    return menu()

def search():
    genre_input = input("Please make a selection from the following genres.\n(Action(A), Animation(N), Comedy(C), "
                    "Drama(D), Documentary(O), or Romance(R)):").lower()
    if genre_input == 'a':
        action_genre()
    elif genre_input == 'n':
        animation_genre()
    elif genre_input == 'c':
        comedy_genre()
    elif genre_input == 'd:':
        drama_genre()
    elif genre_input == 'o':
        documentary_genre()
    elif genre_input == 'r':
        romance_genre()
    else:
        print("Invalid genre")
        print()
        menu()

#this is where I can't get the syntax to work
def action_genre():
    for current in movies_list:
        if current["action"] == "False":
            del current
            break
        for i in movies_list:#using this to test output
            print(i)

load_movies()
menu()

Я сужаю список, исключая вещи, не подходящие под параметры. В функции action_genre я пытаюсь удалить все словари, которые не равны current ["action"] == True. Я пробовал использовать «Истина» и «Ложь» в качестве строк, а также логические значения Истина и Ложь для сравнения, но все же ошибка. К сожалению, мне приходится использовать булеву логику в соответствии с указаниями моих профессоров.

Его, например: Пример профессора. Видимо, так как я новичок, я не могу вставлять изображения. : /

Я занимаюсь программированием 101, поэтому благодарю вас за терпение, когда я узнаю это, и заранее благодарю вас за помощь.

Я предполагаю, что в current["action"] = int(movie_data[4][0]) == 1 вы пытаетесь создать что-то вроде current["action"] = False. В if current["action"] == "False" (в функции action_genre()) вы запрашиваете равенство строк. Вы пробовали изменить это на if not current["action"]?

Xay 01.05.2018 12:44

Да, я использую логическое значение для сортировки элементов в списке. Сначала я попробовал строковый эквивалент как current ["action"] == "False". Я также попытался сделать обратное, используя True в качестве условного.

Matt Craft 01.05.2018 12:48

Выложите стек с ошибкой, может поможет.

kabanus 01.05.2018 13:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пытаетесь сравнить string с boolean. Посмотрите на следующее:

a= 1==1
print a
True

print type(a)
<class 'bool'> # a is a boolean

b='True' #assign string 'True' to b
print type(b)
<class 'str'>

print a==b #compare boolean True to string 'True'
False

b = True # assign boolean True to b
print a==b #compare boolean True to boolean True
True

так что вам нужен if current["action"] == False вместо if current["action"] == "False"

Ответ принят как подходящий

Итак, проблема немного глубже, чем неправильное условие if. В get_action() вы эффективно изменяете не фактический объект movies_list, а локальную переменную current, что подтверждается этим простым тестом:

def action_genre():
    for current in movies_list:
        print(current)
        if not current["action"]:
            del current
        print(current)

Второй print(current) приведет к тому, что UnboundLocalError сообщит, что current больше не существует, в то время как в movies_list запись, которую он только что удалил, продолжает существовать. Но в целом использование del в циклах действительно вызывает проблемы, потому что именно так ведут себя итерируемые объекты и сам del. Я рекомендую вам прочитать об этом больше в других источниках или SO, если хотите, например, здесь.

Используя ответ из предоставленной ссылки выше, мы можем использовать понимание списка для фильтрации фильмов:

def action_genre():
    filtered_movies_list = [movie for movie in movies_list if movie['action']]
    print(filtered_movies_list)

Это создает новый список (чтобы он не изменял movies_list), который включает все словарные статьи, где item['action'] == True.

Надеюсь, это поможет.

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

Matt Craft 01.05.2018 13:51

Другие вопросы по теме