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']]}
你是说重复的子列表而不是项目?