我在组合字典和列表中遇到问题。我理解如何从每个单独拉出键,但我需要将它们组合起来并从两者中拉出键。以下是列出年份的字典示例。每年都有与之相关的头衔和导演。
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,但我没有找到我所寻求的信息。谁能指出我正确的方向?我错误地写了字典吗?或者我只是没有使用正确的方式来打印信息。谢谢
答案 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()转换。