在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答案是因为它更完整。