Return 如果一个较小字典的所有值都存在于一个较大字典中,则为真

Return true if all values of one smaller dictionary exist in a larger dictionary

如果 B 中存在 A 中的 Key1 的所有 而不是任何 ,而 B 没有确切的数量,我如何获得 return 的 True值?

我有一个字典 (A) 有多个较小的键,另一个字典 (B) 只有一个键但有更多的值:

A = {'Key1': ['ONE', 'THREE', 'TWO', 'EIGHT', 'ONE-HUNDRED'],
     'Key2': ['THREE', 'EIGHT', 'FORTYSEVEN', 'TWO'],
     'Key3': ['ONE-HUNDRED', 'SEVEN', 'NINE', 'ONE']
    }

B = {'Key1': ['TWENTY', 'SIXTYEIGHT', 'ONE-HUNDRED', 'SEVEN', 
     'FIVE', 'NINE', 'ONE', 'ZERO', 'ELEVEN', 'TWO-HUNDRED',
     'TWENTY-EIGHT', 'FOUR', 'TWELVE']
}

我已经尝试过 set() 和 all()。我用它来获取相应的密钥(在本例中为 Key1):

match = [k for k in B if B[k] != A[k]]
for k in match:
    print k

>>> 'Key1'

我想我可以在 for 循环中使用 matched = True/False。我正在使用 Python 2.7.

使用套装;测试 A['Key1'] 的集合是否小于或等于 B 中的集合:

set(A['Key1']) <= set(B['Key1'])

<= 仅当左侧集合的 所有 元素也在右侧集合中时才为真,其中右侧集合允许有更多元素:

>>> setb = set(['TWENTY', 'SIXTYEIGHT', 'ONE-HUNDRED', 'SEVEN',
...      'FIVE', 'NINE', 'ONE', 'ZERO', 'ELEVEN', 'TWO-HUNDRED',
...      'TWENTY-EIGHT', 'FOUR', 'TWELVE'])
>>> set(['ONE', 'THREE', 'TWO', 'EIGHT', 'ONE-HUNDRED']) <= setb
False
>>> set(['ONE', 'ONE-HUNDRED']) <= setb  # some elements all in b
True
>>> setb <= setb  # set b is of course a subset of itself
True

如果您需要发现匹配的键,请使用dictionary views;这些也像集合:

all(set(A[k]) <= set(B[k]) for k in A.viewkeys() & B.viewkeys())

对于Python3,使用A.keys()B.keys()dict.viewkeys() 的实现替换了旧的 Python 2 dict.keys() 列表。

foo & bar 生成两个字典的交集——它们共有的所有键:

>>> A = {'Key1': ['ONE', 'THREE', 'TWO', 'EIGHT', 'ONE-HUNDRED'],
...      'Key2': ['THREE', 'EIGHT', 'FORTYSEVEN', 'TWO'],
...      'Key3': ['ONE-HUNDRED', 'SEVEN', 'NINE', 'ONE']
...     }
>>> B = {'Key1': ['TWENTY', 'SIXTYEIGHT', 'ONE-HUNDRED', 'SEVEN',
...      'FIVE', 'NINE', 'ONE', 'ZERO', 'ELEVEN', 'TWO-HUNDRED',
...      'TWENTY-EIGHT', 'FOUR', 'TWELVE']
... }
>>> A.viewkeys() & B.viewkeys()
set(['Key1'])

通过使用 all(),您可以测试所有匹配键的值是否是子集:

>>> all(set(A[k]) <= set(B[k]) for k in A.viewkeys() & B.viewkeys())
False
>>> A['Key1'] = ['ONE', 'ONE-HUNDRED']
>>> all(set(A[k]) <= set(B[k]) for k in A.viewkeys() & B.viewkeys())
True

如果您需要进行大量此类测试,请考虑将您的字典值永久转换为集合。

How do I get a return of True if all, and just not any, values of Key1 in A exist in B, without B having the exact amount of values?

对于这个具体问题,我会使用:

all([value in B['Key1'] for value in A['Key1']])

使用您的初始口述:

>>> A = {'Key1': ['ONE', 'THREE', 'TWO', 'EIGHT', 'ONE-HUNDRED'],
         'Key2': ['THREE', 'EIGHT', 'FORTYSEVEN', 'TWO'],
         'Key3': ['ONE-HUNDRED', 'SEVEN', 'NINE', 'ONE']}

>>> B = {'Key1': ['TWENTY', 'SIXTYEIGHT', 'ONE-HUNDRED', 'SEVEN', 
                  'FIVE', 'NINE', 'ONE', 'ZERO', 'ELEVEN', 'TWO-HUNDRED',
                  'TWENTY-EIGHT', 'FOUR', 'TWELVE']}

>>> all([value in B['Key1'] for value in A['Key1']])
False

现在添加 B 从 A 中丢失的键:

>>> A = {'Key1': ['ONE', 'THREE', 'TWO', 'EIGHT', 'ONE-HUNDRED'],
         'Key2': ['THREE', 'EIGHT', 'FORTYSEVEN', 'TWO'],
         'Key3': ['ONE-HUNDRED', 'SEVEN', 'NINE', 'ONE']}

>>> B = {'Key1': ['THREE', 'EIGHT', 'TWENTY', 'SIXTYEIGHT',
                  'ONE-HUNDRED', 'SEVEN', 'FIVE', 'NINE', 
                  'ONE', 'ZERO', 'ELEVEN', 'TWO-HUNDRED',
                  'TWENTY-EIGHT', 'FOUR', 'TWELVE', 'TWO']}
>>> all([value in B['Key1'] for value in A['Key1']])
True

如果我理解正确,您需要具有 B['Key1'] 中所有值的键。以下代码应该适合您。

A = {'Key1': ['ONE', 'THREE', 'TWO', 'EIGHT', 'ONE-HUNDRED'],
     'Key2': ['THREE', 'EIGHT', 'FORTYSEVEN', 'TWO'],
     'Key3': ['ONE-HUNDRED', 'SEVEN', 'NINE', 'ONE']
    }

B = {'Key1': ['TWENTY', 'SIXTYEIGHT', 'ONE-HUNDRED', 'SEVEN', 
     'FIVE', 'NINE', 'ONE', 'ZERO', 'ELEVEN', 'TWO-HUNDRED',
     'TWENTY-EIGHT', 'FOUR', 'TWELVE']
}
def chk_val(a,b):
    for key in a:
        print("%s = %s"%(key,set(A[key]) <= set(B['Key1'])))

chk_val(A,B)

o/p 将是

Key1 = 假

Key2 = 假

Key3 = True