我试图从列表中排除和删除一些词典。我已经通过网站搜索了一段时间,但没有发现任何特定的内容。词典列表是从位于http://s000.tinyupload.com/?file_id=48953557772434487729
的txt文件创建的我试图理清并排除我不需要的东西。我认为我的语法是正确的,但显然不是。
我只包含必要的代码以减少混乱。我在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函数中,我试图删除所有不等于当前[" action"] == True的词典。我尝试过使用" True"和"错误"作为字符串,以及比较的bool True和False,仍然是一个错误。不幸的是,我必须按照教授的指示使用布尔逻辑。
他的例子: Professor's example. Apparently since I'm new I can't embed images. :/
我正在编程101,所以感谢您耐心等待我的学习,并提前感谢您的帮助。
答案 0 :(得分:0)
您正在尝试将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"
答案 1 :(得分:0)
好的,所以问题比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上阅读更多内容,例如here。
使用上面提供的链接中的答案,我们可以使用列表理解来过滤电影:
def action_genre():
filtered_movies_list = [movie for movie in movies_list if movie['action']]
print(filtered_movies_list)
这会创建一个新列表(因此不会修改movies_list
),其中包含item['action'] == True
所有字典条目。
我希望这会有所帮助。