输入一个数字,搜索列表和字典,打印相关的键

时间:2018-04-14 02:34:38

标签: python list dictionary

我在组合字典和列表中遇到问题。我理解如何从每个单独拉出键,但我需要将它们组合起来并从两者中拉出键。以下是列出年份的字典示例。每年都有与之相关的头衔和导演。

movie_collection = {
    2005: {'Title':'Munich','Director':'Steven Spielberg'},
    2005: {'Title':'The Prestige','Director':'Christopher Nolan'},
    2006: {'Title':'The Departed','Director':'Martin Scorsese'},
    2007: {'Title':'Into the Wild','Director':'Sean Penn'},
    2008: {'Title':'The Dark Knight','Director':'Christopher Nolan'},
    2009: {'Title':'Mary and Max','Director':'Adam Elliot'},
    2010: {'Title':'The King''s Speech','Director':'Tom Hooper'},
    2011: {'Title':'The Artist','Director':'Michel Hazanavicius'},
    2011: {'Title':'The Help','Director':'Tate Taylor'},
    2012: {'Title':'Argo','Director':'Ben Affleck'},
    2013: {'Title':'12 Years a Slave','Director':'Steve McQueen'},
    2014: {'Title':'Birdman','Director':'Alejandro G. Inarritu'},
    2015: {'Title':'Spotlight','Director':'Tom McCarthy'},
    2016: {'Title':'The BFG','Director':'Steven Spielberg'}

}

我还提供了2005年至2016年之间输入年份的代码。如果年份不在这些年份之间,则会打印N / A.

input_year = int(input('Enter a year between 2005 and 2016:\n'))
if input_year < 2005:
    print('N/A')
elif input_year > 2016:
    print('N/A')
else:
    print(input_year)

现在我在这里遇到问题。在其他声明之后,我还需要打印与输入年份相关的电影的标题和导演。例如,如果您输入2011年的输出需要:

输入2005年至2016年之间的一年: 2011 艺术家,Michel Hazanavicius 帮助,泰特泰勒

我编写了以下代码。

if input_year in movie_collection:
    for Title,Director in movie_collection.values():
        print(Title,',',Director)

但它没有输出正确的信息。

Enter a year between 2005 and 2016:
2011
Director , Title
Director , Title
Director , Title
Director , Title
...

我已尝试将其列为多种方式,但它不能正确地提取信息。我仍然是python的新手,我确实尝试了google和bing,但我没有找到我所寻求的信息。谁能指出我正确的方向?我错误地写了字典吗?或者我只是没有使用正确的方式来打印信息。谢谢

2 个答案:

答案 0 :(得分:0)

如果您想继续使用数据结构,请修改列表代码,如下所示:

if input_year in movie_collection:
    movies_for_year = movie_collection[input_year]
    print(movies_for_year['Title'], ',', movies_for_year['Director'])

但是,这不会给你你想要的东西,因为在评论中提到重复的年份密钥相互覆盖 - 用以下方法测试:

print(movie_collection)

1:根据您是否始终首先访问电影年份,还是使用任何其他属性,请使用列表而不是带有年份属性的词组作为电影的一部分:

movie_collection = [
 {'Year':2005, 'Title':'Munich','Director':'Steven Spielberg'},
 {'Year':2005, 'Title':'The Prestige','Director':'Christopher Nolan'},
 #.... rest of list here
 {'Year':2016, 'Title':'The BFG','Director':'Steven Spielberg'}
 ]

输出代码如下所示:

for movie in movie_collection:
    if movie.get('Year', -1) == input_year:
        print(movie.get('Title', 'NA'), ',', movie.get('Director', 'NA'))

2:要维护您的年份索引,数据结构将是列表的字典,如下所示:

movie_collection = {
 2005: [{'Title':'Munich'},
        {'Title':'The Prestige','Director':'Christopher Nolan'}],
 #.... rest of list here
 2016: [{'Title':'The BFG','Director':'Steven Spielberg'}]
}

,输出代码变为:

for movie in movie_collection.get(input_year, []):
    print(movie.get('Title', 'NA'), ',', movie.get('Director', 'NA'))

一个小注释,我使用的是dict.get而不是切片,因为如果一个电影实体缺少一个属性,或者在第二种情况下,如果一年没有电影,这将返回安全提供的默认值而不是崩溃 - 这也会减少如果在dict&#39;中的东西的数量码。如果你100%确定键存在,你可以切片,但要注意!有关详细信息,请参阅https://docs.python.org/3/library/stdtypes.html#dict

欢呼声

答案 1 :(得分:0)

year_input = input("Enter the year\n")
if year_input < str(2005):
    print('N/A')
elif year_input > str(2016):
    print('N/A')
else:
    print(movie_collection[str(year_input)]['Title'], ',', movie_collection[str(year_input)]['Director'])

由于键是年份,它们是整数,我们需要转换为字符串。所以我在最后一行使用str()转换。