gpt4 book ai didi

python - 如何从字典列表中删除重复值并保持原始顺序?

转载 作者:行者123 更新时间:2023-12-05 02:28:22 27 4
gpt4 key购买 nike

我有一个这样的字典列表:

time_array_final = [{'day': 15, 'month': 5},{'day': 29, 'month': 5}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 14, 'month': 6},{'day': 15, 'month': 6}, {'day': 15, 'month': 6}, {'day': 15, 'month': 6}]

我想从此列表中删除重复的词典。这是我尝试过的:

import ast
final = [ast.literal_eval(el1) for el1 in set([str(el2) for el2 in time_array_final])]

最终它可以工作,但有一个问题,我想按原始顺序保留这些数据,但在我的输出中修改了顺序。有没有办法删除重复项并保持原始列表的顺序?

注意: 预期输出 应该是唯一的,并且在重复的情况下应该从重复元素中选择一条记录作为上面的代码,例如在这种情况下输出应该是

[{'day': 15, 'month': 5},{'day': 29, 'month': 5},{'day': 10, 'month': 6}, {'day': 12, 'month': 6}, {'day': 14, 'month': 6},{'day': 15, 'month': 6}]

最佳答案

您可以创建一个字典,其中键是列表中项目的字符串表示,值是实际项目。

time_array_final = [{'day': 15, 'month': 5},{'day': 29, 'month': 5}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 14, 'month': 6},{'day': 15, 'month': 6}, {'day': 15, 'month': 6}, {'day': 15, 'month': 6}]

dedupe_dict = {str(item): item for item in time_array_final}

遇到重复的项目时,字典理解会用重复的项目覆盖前一个项目,但这不会产生任何实质性差异,因为这两个项目是相同的。

自 python 3.6 起,dictionaries keep insertion order , 所以 dict.values() 应该给你你需要的输出。

deduped_list = list(dedupe_dict.values())

给出:

[{'day': 15, 'month': 5},
{'day': 29, 'month': 5},
{'day': 10, 'month': 6},
{'day': 12, 'month': 6},
{'day': 14, 'month': 6},
{'day': 15, 'month': 6}]

@Copperfield 所述在他们的 comments在另一个答案中,str(dict) 不是将字典字符串化以进行比较的最可靠方法,因为键的顺序很重要。

d1 = {'day': 1, 'month': 2}
d2 = {'month': 2, 'day': 1}

d1 == d2 # True
str(d1) == str(d2) # False

要解决这个问题,您可以创建 dict.items()frozenset,并将其用作您的键(前提是您的字典中的所有值都是可哈希)像这样:

dedupe_dict = {frozenset(d.items()): d for d in time_array_final}

关于python - 如何从字典列表中删除重复值并保持原始顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72648520/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com