在dict中重复删除列表的最快方法

Joh*_*nan 7 python dictionary list

我有一个包含列表的字典,需要快速重复删除列表.

我知道如何使用set()函数单独重复删除列表,但在这种情况下,我想要一种快速迭代dict的方法,在路上重复删除每个列表.

hello = {'test1':[2,3,4,2,2,5,6], 'test2':[5,5,8,4,3,3,8,9]}
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像;

hello = {'test1':[2,3,4,5,6], 'test2':[5,8,4,3,9]}
Run Code Online (Sandbox Code Playgroud)

虽然我不一定需要保留列表的原始顺序.

我尝试使用这样的一套,但它不太正确(它没有正确迭代,我丢失了第一个键)

for key, value in hello.items(): goodbye = {key: set(value)}
>>> goodbye
{'test2': set([8, 9, 3, 4, 5])}
Run Code Online (Sandbox Code Playgroud)

编辑:在下面的PM 2Ring的评论之后,我现在以不同的方式填充dict,以避免重复.以前我使用的是列表,但是使用集合可以防止在默认情况下附加dupes;

>>> my_numbers = {}
>>> my_numbers['first'] = [1,2,2,2,6,5]
>>> from collections import defaultdict
>>> final_list = defaultdict(set)
>>> for n in my_numbers['first']: final_list['test_first'].add(n)
... 
>>> final_list['test_first']
set([1, 2, 5, 6])
Run Code Online (Sandbox Code Playgroud)

如您所见,最终输出是一个重复数据集,根据需要.

enr*_*cis 5

您可以将列表推导与deduplicate保留订单的函数一起使用:

def deduplicate(seq):
    seen = set()
    seen_add = seen.add
    return [ x for x in seq if not (x in seen or seen_add(x))]

{key: deduplicate(value) for key, value in hello.items()}
Run Code Online (Sandbox Code Playgroud)


Sup*_*Man 5

这并不是重复的错误,您只是每次都将再见分配为新的字典。您需要将其分配为空dict,然后在每次迭代中将值分配给键。

goodbye = {}
for key, value in hello.items(): goodbye[key] = set(value)
>>> goodbye
{'test1': set([2, 3, 4, 5, 6]), 'test2': set([8, 9, 3, 4, 5])}
Run Code Online (Sandbox Code Playgroud)

另外,由于集合不保留顺序,因此,如果您确实想保留顺序,则最好创建一个简单的迭代函数,该函数将返回跳过已添加值的新列表。

def uniqueList(li):
    newList = []
    for x in li:
        if x not in newList:
            newList.append(x)
    return newList


goodbye = {}
for key, value in hello.items(): goodbye[key] = uniqueList(value)
>>> goodbye
{'test1': [2, 3, 4, 5, 6], 'test2': [5, 8, 4, 3, 9]}
Run Code Online (Sandbox Code Playgroud)