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

Python 在dict中消除重复列表的最快方法,python,list,dictionary,Python,List,Dictionary,我有一个包含列表的dict,需要一种快速的方法来重复列表 我知道如何使用set()函数孤立地重复一个列表,但在这种情况下,我需要一种快速迭代dict的方法,在途中重复每个列表 hello = {'test1':[2,3,4,2,2,5,6], 'test2':[5,5,8,4,3,3,8,9]} 我希望它看起来像 hello = {'test1':[2,3,4,5,6], 'test2':[5,8,4,3,9]} 虽然我不一定需要保留列表的原始顺序 我尝试过使用这样的集合,但它不太正确(它没

我有一个包含列表的dict,需要一种快速的方法来重复列表

我知道如何使用set()函数孤立地重复一个列表,但在这种情况下,我需要一种快速迭代dict的方法,在途中重复每个列表

hello = {'test1':[2,3,4,2,2,5,6], 'test2':[5,5,8,4,3,3,8,9]}
我希望它看起来像

hello = {'test1':[2,3,4,5,6], 'test2':[5,8,4,3,9]}
虽然我不一定需要保留列表的原始顺序

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

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

>>> 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])

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

您可以使用列表理解和保留顺序的函数:

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()}

这并不是重复错误,每次你只是把再见作为一个新的口述来分配。您需要分配为空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])}
此外,由于集合不保留顺序,如果您确实希望保留顺序,最好创建一个简单的迭代函数,该函数将返回一个跳过已添加值的新列表

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]}

这是一种更详细的方法,它保留了顺序并适用于所有Python版本:

for key in hello:
    s = set()
    l = []
    for subval in hello[key]:
        if subval not in s:
            l.append(subval)
            s.add(subval)
    hello[key] = l

请注意:dict理解不适用于较旧的Python版本,如2.7。@Daniel它适用于Python 2.7,但不适用于任何较旧的版本。@AnandSKumar你说得对。我搞砸了。我现在在2.7.10上,这个方法非常有效。谢谢。与将值赋值为set()相比(在另一个答案中)的主要优点是,这样可以将它们保留为一个列表,并保留原始顺序,对吗?我想这就是OP说他的解决方案“不太正确”的原因之一,并且在这里的expected output.OP的列表(!)中保留了顺序。实际上,维持秩序并不重要。因此,这种方法对我来说也很有效。我的解决方案不太正确,因为我分配了一个新值而不是附加值,只留下一个键。为了完整起见,我添加了一个保留二阶的解决方案。我对保留顺序不感兴趣,而且我的列表也是dict的一部分。如果不需要保留顺序,然后选择一种基于集合的方法:它比基于列表的方法更有效,但是如果列表很小或者只有很少的重复项,您可能不会注意到速度差异。考虑将存储集合而不是列表作为DICT的值。OTOH,对于非常小的列表,基于集合的方式可能较慢。另外,集合使用的内存比列表多一点。@PM2Ring我最后使用集合,所以首先避免了重复。defaultdict(set)和.add(n)添加到集合中完成了这项任务。Q更新。啊,酷,这将把“集合”变成一个列表。
for key in hello:
    s = set()
    l = []
    for subval in hello[key]:
        if subval not in s:
            l.append(subval)
            s.add(subval)
    hello[key] = l
my_list = [1,2,2,2,3,4,5,6,7,7,7,7,7,8,9,10]
seen = set()
print list(filter(lambda x:x not in seen and not seen.add(x),my_list))
>>>hello = {'test1':[2,3,4,2,2,5,6], 'test2':[5,5,8,4,3,3,8,9]}    
>>>for key,value in hello.iteritems():
       hello[key] = list(set(value))
>>>hello
{'test1': [2, 3, 4, 5, 6], 'test2': [8, 9, 3, 4, 5]}