有没有一个内置的特性来表示一个dict a包含另一个dict B?

2024-09-28 20:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,dicta包含dictb1,因为:

a = { 'name': 'mary', 'age': 56, 'gender': 'female' }
b1 = { 'name': 'mary', 'age': 56 }

但这是错误的,因为键name的值不同。你知道吗

b2 = { 'name': 'elizabeth', 'age': 56 }

Tags: nameage错误genderb2femaleb1mary
3条回答
set(b1.iteritems()) <= set(a.iteritems())

<=实现^{} objects上的子集关系。当两个dict中的键和值都是可散列的(字符串、元组和int是可散列的,列表不是可散列的)时,这种方法就起作用了。你知道吗

这是“短路”。当发现b2的第一项不在a中时,all()立即终止。还避免了创建临时集的内存开销

>>> a = { 'name': 'mary', 'age': 56, 'gender': 'female' }
>>> b1 = { 'name': 'mary', 'age': 56 }
>>> 
>>> all(a[k]==v for k,v in b1.iteritems())
True
>>> b2 = { 'name': 'elizabeth', 'age': 56 }
>>> all(a[k]==v for k,v in b2.iteritems())
False

b包含不在a中的键的情况下,可以使用

>>> all(a.get(k, object())==v for k,v in b2.iteritems())
False

我将回答词典是否兼容,因此我更改了示例:

>>> test_compat = lambda d1, d2: all(d1[k]==d2[k] for k in set(d1) & set(d2))
>>> a = { 'name': 'mary', 'age': 56, 'gender': 'female' }
>>> b1 = { 'name': 'mary', 'age': 56, 'phone' : '555' }
>>> b2 = { 'name': 'elizabeth', 'age': 56 }
>>> test_compat(a, b1) 
True
>>> test_compat(a, b2)
False
>>> test_compat(b1, a)
True

set(d1) & set(d2)是两个字典之间所有键的交集。all将提前退出任何相应的值不匹配。你知道吗

相关问题 更多 >