在Python中检查数据时避免嵌套循环
我有两个字典列表:在Python中检查数据时避免嵌套循环,python,for-loop,nested,Python,For Loop,Nested,我有两个字典列表: dict_list1 = [{'k1':1, 'k2':2}, {'k1':3, 'k2':4}] dict_list2 = [{'k1':1, 'k2':2, 'k3':10}, {'k1':3, 'k2':4, 'k3':10}] 现在对于dict_列表1中的每个dict_x,我想知道dict_列表2中是否有一个dict_y,它包含dict_x中的每个键和值 除此之外,我想不出其他方法: for dict_x in dict_list1: for dict_y
dict_list1 = [{'k1':1, 'k2':2}, {'k1':3, 'k2':4}]
dict_list2 = [{'k1':1, 'k2':2, 'k3':10}, {'k1':3, 'k2':4, 'k3':10}]
现在对于dict_列表1中的每个dict_x,我想知道dict_列表2中是否有一个dict_y,它包含dict_x中的每个键和值
除此之外,我想不出其他方法:
for dict_x in dict_list1:
for dict_y in dict_list2:
count = len(dict_x)
for key, val in dict_x.items():
if key in dict_y and dict_y[key] == val:
count -= 1
if count == 0:
print('YAY')
break
您可以使用
any
和all
:
dict_list1 = [{'k1':1, 'k2':2}, {'k1':3, 'k2':4}]
dict_list2 = [{'k1':1, 'k2':2, 'k3':10}, {'k1':3, 'k2':4, 'k3':10}]
v = [any(all(c in i and i[c] == k for c, k in b.items()) for i in dict_list2)\
for b in dict_list1]
输出:
[True, True]
您可以使用
any
和all
:
dict_list1 = [{'k1':1, 'k2':2}, {'k1':3, 'k2':4}]
dict_list2 = [{'k1':1, 'k2':2, 'k3':10}, {'k1':3, 'k2':4, 'k3':10}]
v = [any(all(c in i and i[c] == k for c, k in b.items()) for i in dict_list2)\
for b in dict_list1]
输出:
[True, True]
下面,我使用以下事实来检查是否存在
d2.items()
,例如d1.items()
是d2.items()的子集
[any(d1.items()下面,我使用以下事实来检查是否存在d2.items()
,例如d1.items()
是d2.items()的子集
[any(d1.items()dict
视图可以通过不等式运算符执行快速的“is子集”测试。因此:
if dict_x.items() <= dict_y.items(): # Use .viewitems() instead of .items() on Python 2.7
请注意,创建视图需要一些成本(这只是一个固定成本,不依赖于dict
大小),因此,如果性能很重要,缓存视图可能是值得的;为dict\u list1
这样做是免费的:
for dict_x in dict_list1:
dict_x_view = dict_x.items()
for dict_y in dict_list2:
if dict_x_view <= dict_y.items():
print('YAY')
break
这可能会进一步压缩为一个单一的列表理解,从而导致各种匹配,但在这一点上,代码将非常狭窄/难看:
for _ in (dict_x in dict_list1 if any(dict_x.items() <= dict_y.items() for dict_y in dict_list2)):
print('YAY')
for uu in(dict_ux in dict_ulist1,如果有的话)(dict_ux.items()dict
视图可以通过不等式运算符执行快速“is子集”测试。因此:
if dict_x.items() <= dict_y.items(): # Use .viewitems() instead of .items() on Python 2.7
请注意,创建视图需要一些成本(这只是一个固定成本,不依赖于dict
大小),因此,如果性能很重要,缓存视图可能是值得的;为dict\u list1
这样做是免费的:
for dict_x in dict_list1:
dict_x_view = dict_x.items()
for dict_y in dict_list2:
if dict_x_view <= dict_y.items():
print('YAY')
break
这可能会进一步压缩为一个单一的列表理解,从而导致各种匹配,但在这一点上,代码将非常狭窄/难看:
for _ in (dict_x in dict_list1 if any(dict_x.items() <= dict_y.items() for dict_y in dict_list2)):
print('YAY')
for uin(dict_xin dict_ulist1,如果有的话)(dict_x.items())这只检查键,而不是值。另外,它不是有多个循环放在一个1行中吗?是的,我猜也有3个for,但在一行中尝试dict_ulist1=[{'k1''k2':None}]
和dict_list2=[{'k1':1}]
。这只检查键,不检查值。另外,它不是有多个循环放在一行中吗?是的,我也知道有3个FOR,但在一行中尝试dict_list1=[{'k1':1,'k2':None}]
和dict_list2=[{'k1':1}]
。我的当前版本返回一个长度为dict_list1
的列表,表示dict_list2
的某个元素是否是dict_list1
索引中的某个dict的超级dict。我的当前版本返回一个长度为dict_list1
的列表,表示dict_list2的某个元素是否是的超级dict
是目录列表1中该索引处目录的超级目录。接受@ShadowRanger答案是因为它更完整。接受@ShadowRanger答案是因为它更完整。