繁体   English   中英

使用深层复制从 Python 中的列表列表中删除重复项

[英]Removing duplicates from a list of lists in Python using deep copy

我有一个字典列表 - list_1 = [{'account': '1234', 'email': 'abc@xyz.com'}, ... , ...] 我想删除包含重复电子邮件的条目名单。

import copy
list_2 = copy.deepcopy(list_1)
for i in mainList
 for j in range(len(list_2)-1, -1, -1):
   if ((list_2[j]["email"] == mainList[i])):
                    list_1.remove(list1[j])

这里的 MainList 是我用来比较值的电子邮件列表。 mainList 看起来像: ['abc@xyz.com', 'efg@cvb.com, ..., ...] 主要问题是 list_1 没有正确输出。 如果我使用列表、切片甚至列表理解来复制它,它就会变成空的。 最终结果应该给出 list_1,其中每个 email 只包含一个元素/列表/字典。 使用复制或深复制至少给了我一些东西。 有时我似乎也会遇到索引错误。 使用

for x in list_2:

相反,返回 list_1 只有一项。 我最接近正确答案的是在删除项目时迭代 list_1 本身,但它不是 100% 正确的。 请帮忙。

遍历您的字典列表并仅在新字典中不存在时才将每个 email 保存。

temp = dict()
list_1 = [{'account': '1234', 'email': 'abc@xyz.com'}]
for d in list_1:
    if d['email'] in temp:
        continue
    else:
        temp[d['email']] = d
final_list = list(temp.values())

好像你想删除重复的字典。 请在问题中提及重复的字典。

di = [{'account': '1234', 'email' : 'abc@xyz.com'}, {'account1': '12345', 
'email1' : 'abcd@xyz.com'}, {'account': '1234', 'email' : 'abc@xyz.com'}]
s=[i for n, i in enumerate(d) if i not in di[n + 1:]]
Print(s)

这将为您提供所需的 output

[{'account1': '12345', 'email1': 'abcd@xyz.com'}, {'account': '1234', 'email': 
'abc@xyz.com'}]

我觉得完成此操作的最简单方法是根据您的键创建list_1的索引版本(字典)。

list_1 = [
    {'account': '1234', 'email' : 'abc@xyz.com'},
    {'account': '1234', 'email' : 'abc@xyz.com'},
    {'account': '4321', 'email' : 'zzz@xyz.com'},
]

list_1_indexed = {}
for row in list_1:
    list_1_indexed.setdefault(row['email'], row)
list_2 = list(list_1_indexed.values())

print(list_2)

这会给你:

[
    {'account': '1234', 'email': 'abc@xyz.com'},
    {'account': '4321', 'email': 'zzz@xyz.com'}
]

我不确定我会推荐它,但如果你想使用理解,你可以这样做:

list_2 = list({row['email']: row for row in list_1}.values())

请注意,第一个策略导致第一个键行获胜,而理解最后一个键行获胜。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM