python字典检查是否存在除给定键之外的任何键

Vai*_*wal 4 python dictionary

假设我有一个字典,指定包的一些属性:

d = {'from': 'Bob', 'to': 'Joe', 'item': 'book', 'weight': '3.5lbs'}

要检查包字典的有效性,它需要有一个'from''to'键,以及任意数量的属性,但必须至少有一个属性.所以字典可以有两个'item''weight'两个,但不能同时拥有.属性键可以是任何东西,不限于'item''weight'.

我将如何检查字典,以确保它们是有效的,因为在具有'to','from'和至少一种其他关键?

我能想到的唯一方法是获取d.keys(),删除'from''to'键,并检查它是否为空.

有没有更好的方法来做这个?

the*_*eye 8

must = {"from", "to"}
print len(d) > len(must) and all(key in d for key in must)
# True
Run Code Online (Sandbox Code Playgroud)

此解决方案确保您的字典具有比集合中的元素更多的元素,must并且字典中的所有元素must也将存在.

该解决方案的优点在于,它易于扩展.如果你想确保字典中还有一个参数,只需在must字典中包含它,它就能正常工作.您不必改变逻辑.

编辑

除此之外,如果您使用的是Python 2.7,您可以更加简洁地执行此操作

print d.viewkeys() > {"from", "to"}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 3.x,则只需将其写为

print(d.keys() > {"from", "to"})
Run Code Online (Sandbox Code Playgroud)

这个hack的工作原因是,d.viewkeys并且d.keys返回类似set的对象.所以,我们可以使用集合比较运算符.>用于检查左侧边集是否是右侧边集的严格超集.因此,为了满足条件,左侧设置类对象应该具有fromto,以及一些其他对象.

引用set.issuperset文档,

设置>其他

测试集合是否是其他集合的正确超集,即set >= other and set != other.