编辑从txt文件创建的列表中的词典列表

时间:2018-05-01 10:37:08

标签: python list dictionary

我试图从列表中排除和删除一些词典。我已经通过网站搜索了一段时间,但没有发现任何特定的内容。词典列表是从位于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,所以感谢您耐心等待我的学习,并提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您正在尝试将stringboolean进行比较。请看以下内容:

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)会导致UnboundLocalErrorcurrent不再存在,而在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所有字典条目。

我希望这会有所帮助。