将dicts与其他值进行比较

时间:2013-10-11 00:43:23

标签: python

我有两个python dicts列表:realList和expectedList

我希望realList被认为等于expectedList,如果只有一个,对于expectedList的每个dict,在realList上只有一个“sub-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}]

任何模块都有帮助吗?只有我能想到的想法是迭代expectDict并从中删除dict,并在它们匹配时从realDict中删除。然后,最后,两者都必须是[]。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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