Редактирование списка словарей из списка, созданного из текстового файла - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь исключить и удалить некоторые словари из списка. Я некоторое время искал по сайту и не нашел ничего конкретного для этого. Список словарей был создан из текстового файла, расположенного: 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. Я пытался использовать "True" и "False" в качестве строк, а также bool True и False для сравнения, и все еще ошибка. К сожалению, я должен использовать булеву логику в соответствии с указаниями моих профессоров.

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

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Хорошо, значит, проблема проходит немного глубже, чем некорректное условие 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. Я призываю вас прочитать больше об этом в других источниках или ТАК, если хотите, например, здесь .

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

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

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

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

0 голосов
/ 01 мая 2018

Вы пытаетесь сравнить 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"

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