关于Python的方式:quickest dedupe在词典列表

Quickest way to dedupe list in dict

本问题已经有最佳答案,请猛点这里访问。

我有一个包含列表的dict,需要一种快速的方法来删除列表。

我知道如何使用set()函数隔离地删除列表,但在本例中,我希望使用快速的方法遍历dict,在删除过程中删除每个列表。

1
hello = {'test1':[2,3,4,2,2,5,6], 'test2':[5,5,8,4,3,3,8,9]}

我希望它看起来像;

1
hello = {'test1':[2,3,4,5,6], 'test2':[5,8,4,3,9]}

尽管我不需要保留列表的原始顺序。

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

1
2
3
for key, value in hello.items(): goodbye = {key: set(value)}
>>> goodbye
{'test2': set([8, 9, 3, 4, 5])}

编辑:根据pm 2ring下面的评论,我现在以不同的方式填充dict,以首先避免重复。以前我使用的是列表,但是使用集合可以防止默认情况下附加dupe;

1
2
3
4
5
6
7
8
>>> 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])

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


这并不是重复错误,你只是在每次给"再见"指定一个新的dict。您需要分配为空的dict,然后在每次迭代中将值分配给键。

1
2
3
4
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])}

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

1
2
3
4
5
6
7
8
9
10
11
12
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]}


您可以将列表理解与保存顺序的deduplicate函数一起使用:

1
2
3
4
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()}


1
2
3
4
5
>>>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]}


1
2
3
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))

这是一种更详细的方法,它可以保留顺序并在所有Python版本中工作:

1
2
3
4
5
6
7
8
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