【发布时间】:2021-06-22 23:59:01
【问题描述】:
编辑:我需要一个适用于字典列表的解决方案(字典不可散列),所以这不是 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)
此操作后我不需要保留原始列表,因此可以就地。速度是最重要的。所以这个问题也可以改写为:“如何从这些列表中删除两个列表之间的共同元素?”
当您提供解决方案时,请告知它是否也适用于任何两个列表或仅适用于字典列表。
另外请告知您的解决方案是否会删除重复项(我对这两种解决方案都感兴趣):
例子:
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'},
]
【问题讨论】:
-
如果您希望获得良好的性能,您需要使用基于哈希的方法(即使用
set而不是列表)。您将不得不选择其他表示,因为dict对象不可散列。 -
如果你得到这些结果,你怎么知道
a_dict元素中的哪些元素是不同的?您只想找到两者之间不共享的元素吗?还是什么? -
@KarlKnechtel 是的,只有两个列表之间不共享的元素。
标签: python list performance dictionary in-place