Я пытаюсь исключить и удалить некоторые словари из списка. Я некоторое время искал на сайте и не нашел ничего особенного по этому поводу. Список словарей был создан из текстового файла, расположенного по адресу: 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"] == "False". Я также попытался сделать обратное, используя True в качестве условного.
Выложите стек с ошибкой, может поможет.
Вы пытаетесь сравнить 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
.
Надеюсь, это поможет.
Спасибо, в этом есть смысл, но я обязательно прочитаю об этом. Создание нового списка имеет больше смысла, чем изменение исходного списка, особенно с учетом того, что я сделал его глобальной переменной. Я вижу в этом конфликт в будущем. Проверяю эту ссылку сейчас.
Я предполагаю, что в
current["action"] = int(movie_data[4][0]) == 1
вы пытаетесь создать что-то вродеcurrent["action"] = False
. Вif current["action"] == "False"
(в функцииaction_genre()
) вы запрашиваете равенство строк. Вы пробовали изменить это наif not current["action"]
?