【问题标题】:Input a number, Search through Lists and Dictionary, print associated key输入数字,通过列表和字典搜索,打印关联键
【发布时间】:2018-04-14 02:34:37
【问题描述】:

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

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)

现在这是我遇到问题的地方。在 else 语句之后,我还需要打印与输入年份相关的电影的标题和导演。例如,如果您输入 2011 年,则输出需要是:

输入 2005 年到 2016 年之间的年份: 2011 艺术家米歇尔·哈扎那维修斯 帮助,泰特·泰勒

我编写了以下代码。

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,但对我所寻求的信息没有任何帮助。谁能指出我正确的方向?我是不是把字典写错了?或者我只是没有使用正确的方式来打印信息。谢谢

【问题讨论】:

  • 类似if year in movie_collection: print(movie_collection[year]['Title'], movie_collection[year]['Director'])。您应该注意,没有两个movie_collection 条目可以共享同一年(键)。相反,最后一个将覆盖所有以前的条目。
  • 感谢 Patrick 的快速回复。我已经摆弄了您建议的代码,它运行良好,除了关于“没有两个 movie_collection 条目可以共享同一年(键)”的部分。实际上我什至没有想到这一点,因为说明说要按年份列出并将Title和Director合并到一个列表中。关于如何重新编码以仍然遵循年份输入格式并将“标题和导演”保留为列表的任何建议?

标签: python list dictionary


【解决方案1】:

如果你想保留你的数据结构,修改列表代码如下:

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

但是,这不会给你你想要的,因为正如 cmets 中提到的那样,重复的年份键会相互覆盖 - 使用以下方法进行测试:

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 而不是切片,因为如果电影实体缺少属性,或者在第二种情况下,如果年份没有电影,这将返回安全提供的默认值而不是崩溃 - 这也减少了'if thing in dict' 代码的数量。如果您 100% 确定密钥存在,则可以切片,但请注意!有关这方面的更多信息,请参阅 https://docs.python.org/3/library/stdtypes.html#dict

干杯

【讨论】:

    【解决方案2】:
    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() 进行了转换。

    【讨论】:

    • 由于键是整数,我们需要将其转换为字符串。因此在“print(movie_collection[str(year_input)]['Title'], ',', movie_collection[str(year_input)]['Director'])”这一行使用 str() 进行转换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2019-12-12
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多