Python,通过比较不同字段来区分dict列表

Python,通过比较不同字段来区分dict列表,python,python-3.x,lambda,Python,Python 3.x,Lambda,我有两个不同的字典列表: first = [{'id': '1'}, {'id': '2'}, {'id': '3'}] second = [{'user_id': '1'}, {'user_id': '2'}] 我想要像这样的东西: # This is pseudocode first (id) - second (user_id) = [{'id': '3'}] 这在python上可能吗 我知道使用多个循环操作符是可能的,但是有没有更优雅的方法来解决这个问题,比如使用lambdas之

我有两个不同的字典列表:

first = [{'id': '1'}, {'id': '2'}, {'id': '3'}]

second = [{'user_id': '1'}, {'user_id': '2'}]
我想要像这样的东西:

# This is pseudocode 
first (id) - second (user_id) = [{'id': '3'}]
这在python上可能吗


我知道使用多个循环操作符是可能的,但是有没有更优雅的方法来解决这个问题,比如使用lambdas之类的?

这是一种方法。使用
列表理解
lambda

first = [{'id': '1'}, {'id': '2'}, {'id': '3'}]
second = [{'user_id': '1'}, {'user_id': '2'}]

checkVal = map(lambda d: d['user_id'], second)
print([i for i in first if i["id"] not in checkVal])
输出:

[{'id': '3'}]

一种方法是使用嵌套列表,如下所示:

In [9]: [d1 for d1 in first if not any(d2['user_id'] == d1['id'] for d2 in second)]
Out[9]: [{'id': '3'}]
但作为一种更具python风格的方式,最好使用集合操作和列表理解:

In [13]: f = {d['id'] for d in first}

In [14]: s = {d['user_id'] for d in second}

In [15]: result = [{'id': i} for i in f - s]

In [16]: result
Out[16]: [{'id': '3'}]

是否要比较值或键值对?或者我们应该假设第一个列表中的键是第二个列表中键的一部分吗?@BcK键的值。假设您收到了来自不同API的两个JSON,并且您在
first
列表的第三项中有一个打字错误。这是一个集合还是一个字典?@Kasramvd第三个代码块是伪代码,我只想写为“通过比较第一个列表的
id
和第二个列表的
user\u id
”一个优化注释:
checkVal
应该是一个
set
。此外,映射到lambda只是为了提取
用户id
值,这比直接
理解要慢很多倍。我使用lambda只是因为OP想知道是否可以使用它。问题是有没有更优雅的方法来解决这个问题,Lambda可能是一个潜在的解决方案。在我的书中,优雅也意味着优雅地使用可用的资源。我收到了
TypeError:“set”对象不可订阅
error消息
O(N²)
解决
O(N)
问题的方法很多,但它并不优雅。@D先生,正如我在评论中提到的,这是因为你的第三项
{id',3'}
您应该将其更改为
{'id':'3'}
@zwer确实是因为这个原因,我添加了一个基于集合的解决方案。查看更新。