Python 从字典中的每个值中删除重复项

Python 从字典中的每个值中删除重复项,python,dictionary,Python,Dictionary,我有一本字典,上面有如下列表: {'S26': [['2016-03-18', '2016-03-28'], ['2016-03-18', '2016-03-28']], 'S24': [['2016-03-19', '2016-03-25'], ['2016-03-25', '2016-04-03']], 'S25': [['2016-03-18', '2016-03-25'], ['2016-03-18', '2016-03-25'], ['2016-03-20', '2016-03-25'

我有一本字典,上面有如下列表:

{'S26': [['2016-03-18', '2016-03-28'], ['2016-03-18', '2016-03-28']], 'S24': [['2016-03-19', '2016-03-25'], ['2016-03-25', '2016-04-03']], 'S25': [['2016-03-18', '2016-03-25'], ['2016-03-18', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-25', '2016-04-03']]}
我想检查每个列表并删除任何重复的子列表。因此,例如,键S26在列表中具有两个重复项:

'S26': [['2016-03-18', '2016-03-28'], ['2016-03-18', '2016-03-28']]
此键现在应为:

'S26': [['2016-03-18', '2016-03-28']]

这可能吗?此系统上的python版本为2.6.6,您可以使用以下内容:

for val in dict:
    tmp=[]
    for l in dict[val]:
        if l not in tmp: tmp.append(l)
    dict[val]=tmp
d = {'S26': [['2016-03-18', '2016-03-28'], ['2016-03-18', '2016-03-28']], 'S24': [['2016-03-19', '2016-03-25'], ['2016-03-25', '2016-04-03']], 'S25': [['2016-03-18', '2016-03-25'], ['2016-03-18', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-25', '2016-04-03']]}

answer = {k:[list(el) for el in set([tuple(sublist) for sublist in v])]
             for k, v in d.items()}
print(answer)
输出

{'S24': [['2016-03-19', '2016-03-25'], 
         ['2016-03-25', '2016-04-03']],
 'S25': [['2016-03-20', '2016-03-25'],
         ['2016-03-18', '2016-03-25'],
         ['2016-03-25', '2016-04-03']],
 'S26': [['2016-03-18', '2016-03-28']]}

这将迭代字典中的每个
(k,v)
元素对,并从列表值中删除重复的子列表。为此,我们使用列表理解将每个
子列表
转换为一个
元组
,这样我们就可以创建一个
集合
(因为列表是不可散列的)。

这一个同样有效:

>>> from collections import defaultdict
>>>
>>> d = {'S26': [['2016-03-18', '2016-03-28'], ['2016-03-18', '2016-03-28']], 'S24': [['2016-03-19', '2016-03-25'], ['2016-03-25', '2016-04-03']], 'S25': [['2016-03-18', '2016-03-25'], ['2016-03-18', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-25', '2016-04-03']]}
>>> 
>>> out_d = defaultdict(list)
>>> for k,v in d.items():
        for vv in v:
            if vv not in out_d[k]:
                out_d[k].append(vv)

>>> out_d
defaultdict(<class 'list'>, {'S24': [['2016-03-19', '2016-03-25'], ['2016-03-25', '2016-04-03']], 'S26': [['2016-03-18', '2016-03-28']], 'S25': [['2016-03-18', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-25', '2016-04-03']]})
>>从集合导入defaultdict
>>>
>>>d={'S26':['2016-03-18','2016-03-28'],['2016-03-18','2016-03-28'],'S24':['2016-03-19','2016-03-25'],['2016-03-25','2016-04-03'],'S25':['2016-03-18','2016-03-25'],['2016-03-18','2016-03-25'],['2016-03-25'],['2016-03-20','2016-03-25','
>>> 
>>>out\u d=defaultdict(列表)
>>>对于d.项()中的k,v:
对于v中的vv:
如果vv未输入输出[k]:
out_d[k]。追加(vv)
>>>出局
defaultdict(,{'S24':['2016-03-19','2016-03-25',['2016-03-25','2016-04-03'],'S26':[['2016-03-18','2016-03-28'],'S25':['2016-03-18','2016-03-25'],['2016-03-20','2016-03-25'],['2016-03-03-25'],['2016-03-03-25'],'2016-03-03-03']))

如果需要保留列表的顺序,以下方法将起作用:

from collections import OrderedDict

dlol = {
    'S26': [['2016-03-18', '2016-03-28'], ['2016-03-18', '2016-03-28']], 
    'S24': [['2016-03-19', '2016-03-25'], ['2016-03-25', '2016-04-03']], 
    'S25': [['2016-03-18', '2016-03-25'], ['2016-03-18', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-25', '2016-04-03']]}

output = {}

for k, lol in dlol.items():
    output[k] = OrderedDict([(tuple(e), None) for e in lol])

output = {k: list(list(e) for e in v) for k, v in output.items()}    
print(output)
给你:

{'S25': [['2016-03-18', '2016-03-25'], ['2016-03-20', '2016-03-25'], ['2016-03-25', '2016-04-03']], 
'S24': [['2016-03-19', '2016-03-25'], ['2016-03-25', '2016-04-03']], 
'S26': [['2016-03-18', '2016-03-28']]}

你是说重复的子列表而不是项目?