1

我有 2 个 python 字典列表:realList 和 expectedList

我希望 realList 被认为等于 expectedList 如果在 realList 上有一个且只有一个“sub-dict”对于 expectedList 的每个 dict

通过 sub-dict 我的意思是一个至少具有相同键/值的字典,但它可能具有额外的键/值。

所以,例如:

realDict =     [{'a': 1, 'b': 2}, {'a': 2, 'b': 3}]
==
expectedDict = [{'a': 1},         {'a': 2, 'b': 3}]


realDict =     [{'a': 1, 'b': 2}, {'a': 2, 'b': 3}]
!=
expectedDict = [{'a': 2},         {'a': 2, 'b': 3}]


realDict =     [{'a': 1, 'b': 2}, {'a': 1, 'b': 3}]
!=
expectedDict = [{'a': 1}]

有什么模块可以帮忙吗?我能想到的唯一想法是迭代 expectedDict 并在它们匹配时从它和 realDict 中删除一个 dict。那么,最后,两者都必须是[]。

4

2 回答 2

1

这可行,但我不确定它的性能如何:

def complete_subset(real_list, expected_list):
    real_set_list = [set(d.items()) for d in real_list]
    expected_set_list = [set(d.items()) for d in expected_list]

    while len(real_set_list):
        real_len = len(real_set_list)
        i = 0
        for real_set in real_set_list:
            for expected_set in expected_set_list:
                if not len(expected_set - real_set):
                    real_set_list.remove(real_set)
                    expected_set_list.remove(expected_set)
            i = i + 1
        if i == real_len:
            break

    return (not len(real_set_list)) and (not len(expected_set_list))

这是我的测试:

print complete_subset([{'a': 1, 'b': 2}, {'a': 2, 'b': 3}], [{'a': 1}, {'a': 2, 'b': 3}]) == True
print complete_subset([{'a': 1, 'b': 2}, {'a': 2, 'b': 3}], [{'a': 2}, {'a': 2, 'b': 3}]) == False
print complete_subset([{'a': 1, 'b': 2}, {'a': 2, 'b': 3}], [{'a': 1}]) == False
print complete_subset([{'a': 1, 'b': 2}, {'a': 1, 'b': 2}], [{'a': 1}, {'b': 2}]) == True
print complete_subset([
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
], [
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5},
    {'a': 1, 'b': 2, 'c': 3, 'd': 4},
    {'a': 1, 'b': 2, 'c': 3},
    {'a': 1, 'b': 2},
    {'a': 1},
    {'a': 1, 'c': 3, 'd': 4, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'c': 3, 'e': 5, 'f': 6, 'h': 8, 'i': 9, 'j': 10},
    {'a': 1, 'b': 2, 'd': 4, 'e': 5, 'g': 7, 'h': 8, 'j': 10},
]) == True
于 2013-10-11T03:54:39.847 回答
-1

如果您的两个列表要逐个元素进行比较,您可以这样做。

def compare(realDict, expectedDict):
    if len(readDict) != len(expectedDict):
        return False
    for d1, d2 in zip(realDict, expectedDict):
        for key in d2:
            if key not in d1 or d1[key] != d2[key]:
                return False
    return True
于 2013-10-11T00:57:35.760 回答