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确实是因为这个原因,我添加了一个基于集合的解决方案。查看更新。