如何比较多个键值对的两个字典列表?

x10*_*084 4 python dictionary python-3.x

我有两个lists dict,一个是另一个的修改子集。我想基于两个键来获取list_one未出现在 中的元素list_two。例子:

list_one = [{'name': 'alf', 'age': 25},
            {'name': 'alf', 'age': 50},
            {'name': 'cid', 'age': 30}]
list_two = [{'name': 'alf', 'age': 25, 'hair_color': 'brown'},
            {'name': 'cid', 'age': 30, 'hair_color': 'black'}]
desired_list = [{'name': 'alf', 'age': 50}]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我有一种感觉,它与某种list comprehension,例如:

desired_list = [x for x in list_one if x['name'] != x2['name'] and x['age'] != x2['age'] 
                for all x2 in list_two]
Run Code Online (Sandbox Code Playgroud)

Ste*_*uch 5

我认为这很容易通过以下两种理解来完成:

代码:

have_2 = {(d['name'], d['age']) for d in list_two}
extra = [d for d in list_one if (d['name'], d['age']) not in have_2]
Run Code Online (Sandbox Code Playgroud)

这首先创建一个我们已经拥有settuples,然后检查哪些dicts 与这些现有键中的任何一个都不匹配。

测试代码:

list_one = [{'name': 'alf', 'age': 25},
            {'name': 'alf', 'age': 50},
            {'name': 'cid', 'age': 30}]
list_two = [{'name': 'alf', 'age': 25, 'hair_color': 'brown'},
            {'name': 'cid', 'age': 30, 'hair_color': 'black'}]

have_2 = {(d['name'], d['age']) for d in list_two}
extra = [d for d in list_one if (d['name'], d['age']) not in have_2]

print(extra)
Run Code Online (Sandbox Code Playgroud)

结果:

[{'name': 'alf', 'age': 50}]
Run Code Online (Sandbox Code Playgroud)