我有多个字典,其中包含取决于其业务价值的数据,例如:
companies = {'google': 'value_1', 'facebook': 'value_2'}
names = {'alex': 'value_3', 'john': 'value_4'}
...
Run Code Online (Sandbox Code Playgroud)
我需要检查一个变量x是否包含在这些字典中的任何一个中,并确定它包含在哪些字典中。此类字典的数量可能很大,因此手动检查它们不是很有效。有没有比这更pythonic的东西
companies = {'google': 'value_1', 'facebook': 'value_2'}
names = {'alex': 'value_3', 'john': 'value_4'}
...
Run Code Online (Sandbox Code Playgroud)
Python字典keyview对象实际上是类似集合的。您可以轻松地用它们制作一组:
>>> a = {'a':1, 'b':2}
>>> b = {'a':2, 'c':3}
>>> a.keys() | b.keys()
{'a', 'b', 'c'}
Run Code Online (Sandbox Code Playgroud)
现在您需要做的就是检查集合中的成员资格
>>> if x in that_set: ...
Run Code Online (Sandbox Code Playgroud)
如果您有大量字典,您可以查看此答案以了解如何建立多个集合的并集,但请记住这set.union(dict.keys())是不合法的......
>>> set.union(a.keys())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor 'union' for 'set' objects doesn't apply to a 'dict_keys' object
Run Code Online (Sandbox Code Playgroud)
所以你需要做类似的事情
>>> all_keys = set.union(*(set(d) for d in all_dicts))
Run Code Online (Sandbox Code Playgroud)
在推导式中显式地将每个字典转换为一个集合。
当然,你也可以合并所有字典,达到类似的效果:
>>> all_dicts = {**dict1, **dict2, **dict3}
>>> "key" in all_dicts
Run Code Online (Sandbox Code Playgroud)
这仍然是一种非常有效的方法,可以在给定键的所有字典中查找至少一个值,尽管它仍然无法告诉您该键位于哪个字典中。为此,恐怕您必须迭代。azro 的很好的答案告诉你如何做到这一点。