n词典的差异

2024-05-18 12:22:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法来确定以下场景中n个字典的差异: 有n本词典。他们的一些钥匙匹配,但不是全部。像这样:

dict_a = {
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyC': 'valueC',
    'keyD': 'valueD',
    'keyE': 'valueE',
    'keyF': 'valueF',
    'keyG': 'valueG'
}
dict_b = {
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyX': 'valueX',
    'keyD': 'valueH',
    'keyE': 'valueE',
    'keyF': 'valueF',
    'keyG': 'valueG'
}

我想知道,一个键的值是否与另一个字典中同一个键的值不同。在上面的示例中,应返回keyD,因为它的值在dict_adict_b中不同keyX不应返回,因为它只出现在dict_b中。仅使用两个词典相对容易,但是使用n词典实现这一点的最佳实践是什么


Tags: 字典dict词典valuebvalueakeybkeyavaluee
3条回答

迭代字典列表以进行比较,并跟踪以前看到的所有键及其值(通过orig.update()调用完成)

compare = [{
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyC': 'valueC',
    'keyD': 'valueD',
    'keyE': 'valueE',
    'keyF': 'valueF',
    'keyG': 'valueG'
},
{
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyX': 'valueX',
    'keyD': 'valueH',
    'keyE': 'valueE',
    'keyF': 'valueF',
    'keyG': 'valueG'
},
{
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyX': 'valueX',
    'keyD': 'valueH',
    'keyE': 'valueE',
    'keyF': 'valueF',
    'keyG': 'valueB'
}]

orig = compare[0]
diffs = []

for comp in compare[1:]:
    for k in comp:
        if k in orig and orig[k] != comp[k]:
            diffs.append(k)

    orig.update(comp)

print(diffs)

。。输出['keyD', 'keyG'],这是三个dict值不同的两个键。如果您不希望键显示多次(即,如果您只需要知道它们已更改,而不需要知道它们更改了多少次),请使用字典替换diffs,并使用dict.values()

您可以创建这个简单的lambda函数:

>>> diff_keys = lambda x,y: [key for key in x.keys() if key in y.keys() and x[key] != y[key]]

>>> diff_keys(dict_a, dict_b)
['keyD']

要处理n其他DICT,您可以创建另一个函数,该函数可以这样做:

>>> def get_different_keys(original_dict: dict, other_dicts: list):
...     different_keys = []
...     for dict_x in other_dicts:
...         different_keys.extend(diff_keys(original_dict, dict_x))
...         original_dict.update(dict_x)
...     return different_keys

>>> get_different_keys(dict_a, [dict_b]))
['keyD']
dict_a = {
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyC': 'valueC',
    'keyD': 'valueD',
    'keyE': 'valueE',
    'keyF': 'valueF',
    'keyG': 'valueG'
}

dict_b = {
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyX': 'valueX',
    'keyD': 'valueH',
    'keyE': 'valueE',
    'keyF': 'valueF',
    'keyG': 'valueG'
}

dict_c = {
    'keyA': 'valueA',
    'keyB': 'valueB',
    'keyX': 'valueX',
    'keyD': 'valueH',
    'keyE': 'valueO',    # <- here is additional difference
    'keyF': 'valueF',
    'keyG': 'valueG'
}

# Step 1: prepare list of all dict

dicts = [dict_a, dict_b, dict_c]

# Step 2: get all common keys 

ks = [set(i.keys()) for i in dicts]
ks_i = list(ks[0].intersection(*ks[1:]))
ks_i

Out[1]:  # here is the list of common keys
['keyB', 'keyE', 'keyF', 'keyD', 'keyG', 'keyA']

# Step 3: get set of values taken from the different dict by the same keys

unequal = [{i[k] for i in dicts} for k in ks_i]
unequal
Out[2]:                 #show set of values for same keys  
[{'valueB'},            # for keyB
 {'valueE', 'valueO'},  # for keyE
 {'valueF'},            # and so on
 {'valueD', 'valueH'},
 {'valueG'},
 {'valueA'}]


# Step 4: check if the length of set and chooe appropriate keys
# if the set has length >1 then it has different values inside

[ks_i[ind] for ind,v in enumerate(unequal) if len(v) >1]

Out[3]:
['keyE', 'keyD']

相关问题 更多 >

    热门问题