Python 如何检查其他字典关键字中的值
我有下面的强制钥匙 字段=['b1','b2','b3'] 我的字典在下面 正文={'a':1,'b':[{'b1':1,'b2':2,'b3':3},{'b1':4,'b2':5,'b3':6}]} 在body的b键中,我需要检查字段中的所有值是否存在 如果字段=['b1','b2','b4']我需要False,因为b4不存在于主体['b'] 如果body={'a':1,'b':[{'b1':1,'b2':2,'b3':3},{'b1':4,'b2':5,'b4':6}]},那么我还需要False,因为b4不在字段中 我的代码在下面 Listach中的所有字段。字段中字段的正文['b']中每个字段的键 每次我实现时如何创建一个lambda函数,如下所示:Python 如何检查其他字典关键字中的值,python,Python,我有下面的强制钥匙 字段=['b1','b2','b3'] 我的字典在下面 正文={'a':1,'b':[{'b1':1,'b2':2,'b3':3},{'b1':4,'b2':5,'b3':6}]} 在body的b键中,我需要检查字段中的所有值是否存在 如果字段=['b1','b2','b4']我需要False,因为b4不存在于主体['b'] 如果body={'a':1,'b':[{'b1':1,'b2':2,'b3':3},{'b1':4,'b2':5,'b4':6}]},那么我还需要Fal
>>> fields = ['b1', 'b2', 'b3']
>>> body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}
>>> trueFalse = lambda x, y: [TorF in y for TorF in x].count(True) == len(x)
>>> all((trueFalse(list(x.keys()),fields)) for x in body["b"] )
True
>>>
>>> body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b4': 6}]}
>>> all((trueFalse(list(x.keys()),fields)) for x in body["b"] )
False
按如下方式创建lambda函数如何:
>>> fields = ['b1', 'b2', 'b3']
>>> body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}
>>> trueFalse = lambda x, y: [TorF in y for TorF in x].count(True) == len(x)
>>> all((trueFalse(list(x.keys()),fields)) for x in body["b"] )
True
>>>
>>> body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b4': 6}]}
>>> all((trueFalse(list(x.keys()),fields)) for x in body["b"] )
False
使用集
a = set(body['b'][0]) | set(body['b'][1])
b = set(fields)
c = a ^ b
print(c)
if len(c):
print(False)
else:
print(True)
使用集
a = set(body['b'][0]) | set(body['b'][1])
b = set(fields)
c = a ^ b
print(c)
if len(c):
print(False)
else:
print(True)
如果您确实需要列表理解,这是可行的: 字段=['b1','b2','b3'] 正文={'a':1,'b':[{'b1':1,'b2':2,'b3':3},{'b1':4,'b2':5,'b4':6}]} printFalse不在[i in字段中,i in[item for subl in[listd.keys for d in body['b']]for item in subl]] 输出: 错误的
但在这一点上,您还可以使用正则for循环。如果您确实需要列表理解,这是可行的: 字段=['b1','b2','b3'] 正文={'a':1,'b':[{'b1':1,'b2':2,'b3':3},{'b1':4,'b2':5,'b4':6}]} printFalse不在[i in字段中,i in[item for subl in[listd.keys for d in body['b']]for item in subl]] 输出: 错误的
但此时,您最好使用常规for循环。您可以尝试使用functools: 在dicts中查找所有相交键 检查相交键中的字段
您可以尝试使用以下工具: 在dicts中查找所有相交键 检查相交键中的字段
你总是在变为现实,因为你的代码都是在一系列生成器上完成的 正如另一位所说,理解是不可读的,因此不推荐这样做 如果您仍然需要它,您可以使用:
body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}
fields = ['b1', 'b2', 'b4']
out = all(all((f in each.keys() for f in fields)) for each in body['b'])
print(out) #=> False
fields = ['b1', 'b2', 'b3']
out = all(all((f in each.keys() for f in fields)) for each in body['b'])
print(out) #=> True
你总是在变为现实,因为你的代码都是在一系列生成器上完成的 正如另一位所说,理解是不可读的,因此不推荐这样做 如果您仍然需要它,您可以使用:
body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}
fields = ['b1', 'b2', 'b4']
out = all(all((f in each.keys() for f in fields)) for each in body['b'])
print(out) #=> False
fields = ['b1', 'b2', 'b3']
out = all(all((f in each.keys() for f in fields)) for each in body['b'])
print(out) #=> True
考虑到您的数据结构
body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}
您可以通过以下方式找到正文['b']列表中dicts中的所有键:
然后可以使用集合减法查找所有缺少的字段:
fields = ['b1', 'b2', 'b3']
required_fields = set(fields)
missing = required_fields - present_fields
print("MISSING2:", missing)
打印集,即空集,无必填字段缺失
另一个例子是:
fields = ['b1', 'b2', 'b4']
required_fields = set(fields)
missing = required_fields - present_fields
print("MISSING2:", missing)
它打印{b4'},表示缺少b4字段。给定您的数据结构
body = {'a': 1, 'b': [{'b1': 1, 'b2': 2, 'b3': 3}, {'b1': 4, 'b2': 5, 'b3': 6}]}
您可以通过以下方式找到正文['b']列表中dicts中的所有键:
然后可以使用集合减法查找所有缺少的字段:
fields = ['b1', 'b2', 'b3']
required_fields = set(fields)
missing = required_fields - present_fields
print("MISSING2:", missing)
打印集,即空集,无必填字段缺失
另一个例子是:
fields = ['b1', 'b2', 'b4']
required_fields = set(fields)
missing = required_fields - present_fields
print("MISSING2:", missing)
它打印出{b4'},意味着b4字段丢失。您是否尝试过先编写一个简单的for循环?@mkrieger1我需要先使用列表理解,然后再编写一个循环,一旦它正常工作,您就可以机械地将其转换为列表理解。顺便说一句,您编写的不是列表理解。这应该有效。。。。。。[False if False in[True if lensetlistb.keys+fields==lenb.keys else False for b in body['b']]else True]你试过先写一个简单的for循环吗?@mkrieger1我需要使用列表理解,然后先写一个循环,然后在它正常工作后,你可以机械地将它转换为列表理解。顺便说一句,你写的不是列表理解。这应该行得通……[如果在[如果lensetlistb.keys+fields==lenb.keys else False,则为True,对于正文中的b['b']]else True]或使用frozenset或使用frozenset