一个键在两个字典列表之间的python差异

2024-07-01 07:15:12 发布

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

我有两个类似于以下的词典列表:

a = [
     {'username': 'user1', 'is_admin': False}, 
     {'username': 'user2', 'is_admin': True}, 
     {'username': 'user3', 'is_admin': True}
    ]

b = [
     {'username': 'user1', 'is_admin': False}, 
     {'username': 'user2', 'is_admin': False}, 
     {'username': 'user4', 'is_admin': True}
    ]

现在,我想比较这两个列表,得到如下数据:

difference between a and b =
{'added': 
    [{'username': 'user4', 'is_admin': True}], 
 'removed': 
    [{'username': 'user3', 'is_admin': True}], 
 'updated': 
    [{'username': 'user2', 'is_admin': False}], 
  'unchanged': 
    [{'username': 'user1', 'is_admin': False}]]
 }

说明:user4添加到b列表中,User3从b列表中删除,user2的值更新(is_admin字段),user1不变

我有一个选项可以循环浏览其中一个列表,并在其他列表中搜索每个“用户名”键。但这似乎不是一个有效的选择(在每个循环中搜索整个数组)

有没有有效的方法来解决这个问题


Tags: and数据falsetrue列表adminisusername
2条回答

我尝试了下面的代码,它成功了。 我在这里所做的是找到存在于b中而不存在于a(添加列表)中的dict。然后删除a中存在但不在b中的dict(已删除列表)。由于a和b中的“user2”不完全相同(更新),因此“user2”的数据将出现在添加和删除列表中,因此在下一步中,我找到了添加和删除列表中的用户名列表,然后从添加和删除列表中删除了dict,该列表中的用户名出现在更新的用户名列表中

a = [
     {'username': 'user1', 'is_admin': False}, 
     {'username': 'user2', 'is_admin': True}, 
     {'username': 'user3', 'is_admin': True}
    ]

b = [
     {'username': 'user1', 'is_admin': False}, 
     {'username': 'user2', 'is_admin': False}, 
     {'username': 'user4', 'is_admin': True}
    ]

added = [i for i in b if i not in a]
removed = [i for i in a if i not in b]
unchanged = [i for i in a if i in b]
updated_usernames = [i 
                    for i in list(i['username'] for i in added) 
                    if i in list(i['username'] for i in removed)]
updated = []
for i in added:
    if i['username'] in updated_usernames:
        added.remove(i)
        updated.append(i)
for i in removed:
    if i['username'] in updated_usernames:
        removed.remove(i)

difference_between_a_and_b = {'added': added, 
 'removed': removed, 
 'updated': updated, 
  'unchanged': unchanged
 }

print(difference_between_a_and_b)

我得到的输出 enter image description here

你需要确定地循环浏览列表。为了提高效率,可以从前两个列表(或其副本)中删除选中的元素,并在发现要处理的元素后中断嵌套循环。我认为这将大大提高效率

示例(伪代码):

while a or b:
  x = pop(a)
  y = pop(b)
  # compare x and y (try to use built-in methods such as map, filter etc. to make it fast)
  # append to one of the differences dictionary's list 

相关问题 更多 >

    热门问题