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]} |
您可以将列表理解与保存顺序的
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 |