python - 获取两个字典列表之间的差异(结果为两个差异列表)

标签 python list performance dictionary in-place

编辑:我需要一个适用于字典列表的解决方案(字典不可散列),因此这不是 Compute list difference 的重复项


我有两个字典列表。它们包含 Gmail 标签/过滤器。我需要以两个差异列表的形式获得它们之间的差异。我希望保留元素的顺序。

示例:

a=[
    {'name': 'label_a'},
    {'color': {'background': '#42d692', 'text': '#094228'}, 'name': 'label_b'},
    {'name': 'label_d'},
    {'name': 'label_e'},
]

b=[
    {'name': 'label_a'},
    {'name': 'label_b'},
    {'name': 'label_c'},
    {'name': 'label_d'},
]

预期结果:

a_diff=[
    {'color': {'background': '#42d692', 'text': '#094228'}, 'name': 'label_b'},
    {'name': 'label_e'},
]

b_diff=[
    {'name': 'label_b'},
    {'name': 'label_c'},
]

这就是我可以做到这一点的方法,但我认为这可能效率低下。我可以做得更好吗?

a_diff=[]
b_diff=[]

for i in a:
    if i not in b:
        a_diff.append(i)

for j in b:
    if j not in a:
        b_diff.append(j)

在此操作之后我不需要保留原始列表,因此可以就地进行。速度是最重要的。所以这个问题也可以改写为:“如何从这些列表中删除两个列表之间的公共(public)元素?”

当您提供解决方案时,请告知它是否也适用于任何两个列表或仅适用于字典列表。

另请告知您的解决方案是否会删除重复项(我对两种解决方案都感兴趣):

示例:

a=[
    {'name': 'label_a'},
    {'name': 'label_a'},
    {'name': 'label_b'},
]

b=[
    {'name': 'label_a'},
    {'name': 'label_b'},
    {'name': 'label_c'},
]

删除重复项的结果:

a_diff=[
]

b_diff=[
    {'name': 'label_c'},
]

未删除重复项的结果:

a_diff=[
    {'name': 'label_a'},
]

b_diff=[
    {'name': 'label_c'},
]

最佳答案

这是一种有点奇怪的方法,但它确实有效:

def make_hash(list_of_dicts):
    return {str(d): i for i, d in enumerate(list_of_dicts)}


def ordered_diff(d1, d2):
    return [eval(d) for d in sorted(d1.keys() - d2, key=d1.get)]


def get_diff(l1, l2):
    d1, d2 = make_hash(l1), make_hash(l2)
    return ordered_diff(d1, d2), ordered_diff(d2, d1)

关于python - 获取两个字典列表之间的差异(结果为两个差异列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68091970/

相关文章:

objective-c - 绘制许多 MKOverlay 时的性能问题

python - 关于 tokenize.py 的问题

python - 使用 PyCLIPS 加载事实非常慢,而使用 CLIPS 加载速度很快

c - 最佳缓冲区大小

python - 使用带有列表理解的嵌套 for 循环构建列表

r - 在 for 循环中提取数据并将其 append 到新数据集

performance - 加特林进纸器问题 : No attribute name 'CSVFieldName' is defined issue

python - pip install openssl/aes.h 错误和 libxml/xmlversion.h 错误 (osx)

python - 从列表中消除半重复项的高性能方法

python - 从列表中删除某些项目重复的列表