我有一个包含列表的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]}
虽然我不一定需要保留列表的原始顺序。
我尝试使用这样的套装,但它不太正确(它没有正确迭代,而且我失去了第一把钥匙)
for key, value in hello.items(): goodbye = {key: set(value)}
>>> goodbye
{'test2': set([8, 9, 3, 4, 5])}
编辑:在下面的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])
如您所见,最终输出是一个重复数据集,视需要而定。
答案 0 :(得分: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()}
答案 1 :(得分:5)
它不是错误的迭代,你只是每次都将再见作为一个新的dict。您需要指定为空的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]}
答案 2 :(得分:3)
>>>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]}
答案 3 :(得分:0)
这是一种更冗长的方式,可以保留顺序并适用于所有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
答案 4 :(得分:0)
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))