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
如果 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