如何测试密钥是否在另一个字典中的字典中?

时间:2016-03-12 18:18:34

标签: python dictionary

如何测试某个键是否在字典内,在另一个字典中?

例如,我希望它仅在“恐慌室”的情况下返回True。在Shane'里面。字典,在评级字典里面。

ratings={'Shane': {'Panic Room': 4, 'Avatar': 5}, 'Joe': {'Panic Room': 3}}

会回归真实,因为Shane的词典中有'Panic Room'在它。

如果我在寻找阿凡达'与' Joe'然后它将返回False,因为没有' Avatar'对应于' Joe'。

要阅读整个字典,请使用:

print ratings

要阅读用户的评分,请使用:

print ratings["Shane"]

要阅读用户的电影评分,请使用:

print ratings["Shane"]["Avatar"]

简单的单行答案确实有帮助。

我试过了:

if ratings["Shane"]["Avatar"] in ratings:
print "yes"

if ["Shane"]["Avatar"] in ratings:
print "yes"

但他们似乎无法工作。

1 个答案:

答案 0 :(得分:4)

您有一个数据结构,并且您希望从中获取信息。您的设计的一个重要部分是弄清楚您想要什么,以及如何处理您在此过程中遇到的错误。所以,让我们从数据开始

>>> ratings={'Shane': {'Panic Room': 4, 'Avatar': 5}, 'Joe': {'Panic Room': 3}}

现在我们想看看人们如何喜欢“阿凡达”

>>> ratings['Shane']['Avatar']
5
>>> ratings['Joe']['Avatar']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Avatar'
>>> ratings['Fred']['Avatar']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Fred'
>>> 

很多问题。乔没有评价电影,弗雷德甚至不在数据库中。显然,我们需要改进我们的错误处理。一种选择是分别测试用户名和电影名称,以便您可以获得详细的错误。我在此示例中引发了KeyError dict,但您可以在错误情况下执行其他操作

>>> def get_rating(ratings, name, film):
...     if name in ratings:
...         if film in ratings[name]:
...             return ratings[name][film]
...         else:
...             raise KeyError("{} did not review {}".format(name, film))
...     else:
...         raise KeyError("{} did not review any films".format(name))
... 
>>> for name in ("Shane", "Joe", "Fred"):
...     try:
...         print(name, get_rating(ratings, name, "Avatar"))
...     except KeyError as e:
...         print(e)
... 
Shane 5
'Joe did not review Avatar'
'Fred did not review any films'

假设我想要电影的平均评分。由于ratings.values()是所有用户的指示,我可以做一个简单的列表理解,检查电影是否被评级而不担心异常

>>> avatar = [userrate["Avatar"] for userrate in ratings.values()
...     if "Avatar" in userrate]
>>> avatar
[5]
>>> average = sum(avatar)/len(avatar)
>>> average
5.0

另一种选择是使用dict.get方法的默认值。在这里,如果用户不存在,我会提供空电影评级dict,如果dict中的电影不存在,我会给出默认答案

>>> for name in ("Shane", "Joe", "Fred"):
...     print(name, ratings.get(name, {}).get("Avatar", "Not rated"))
... 
Shane 5
Joe Not rated
Fred Not rated

这些是处理嵌套dicts的一些常用方法,正如您所看到的,哪个选项最好取决于您对给定任务的目标。