如何测试某个键是否在字典内,在另一个字典中?
例如,我希望它仅在“恐慌室”的情况下返回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"
但他们似乎无法工作。
答案 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的一些常用方法,正如您所看到的,哪个选项最好取决于您对给定任务的目标。