从字典中删除重复值而不删除键

时间:2013-08-15 14:38:22

标签: python dictionary duplicates

我是Python的新手,我不得不通过反复试验来学习,但我无法找到解决问题的方法。

我有一个字典,看起来像这样:

myDict = {'key1': ['item1', 'item2', 'item3'], 'key2': ['item4', 'item5', 'item6'],  
'key3': 'item7', 'key4': 'item8', 'key5': ['item1', 'item2', 'item3'], 'key6': 'item7'}

我需要从字典中删除重复的值,并用空值(“”)替换它们。在这里找到了几个解决方案,但它们正在按预期工作

for key, value in myDict.items():
    if values not in key newDict.values():
        myDict[key] = value
    else:
        myDict[key] = ""
print newDict

这是删除所有值并输出

# newDict:{key1: '', key2: '', key3: '', key4: '', key5: '', key6: '')

我正在寻找输出

# newDict = {'key1': '', 'key2':['item4', 'item5', 'item6'], 'key3': '', 'key4':  
'item8', key5: ['item1', 'item2', 'item3'], 'key6': 'item7'}

2 个答案:

答案 0 :(得分:2)

您有正确的总体想法,但您的代码存在三个问题:

        
  1. 您将值存储回myDict而不是newDict
  2.     
  3. 在第2行,您正在检查values而不是value
  4.     
  5. 同样在第2行,key不应该在那里,并抛出SyntaxError
  6. 这是正确的代码:

    newDict = {}
    for key, value in myDict.iteritems():
        if value not in newDict.values():
            newDict[key] = value
        else:
            newDict[key] = ""
    print newDict
    

    如果你不在反三元营运者营地,你也可以缩短它:

    newDict = {}
    for key, value in myDict.iteritems():
        newDict[key] = value if value not in newDict.values() else ""
    print newDict
    

    或者,如果您只想删除原始dictmyDict)中的值而不是构建新值(newDict),则可以执行以下操作:

    foundValues = []
    for key, value in myDict.iteritems():
        if value not in foundValues:
            foundValues.append(myDict[key])
        else:
            myDict[key] = ""
    print myDict
    

    如果您需要按特定顺序删除重复值,请查看OrderedDicts

    <强>更新

    根据更新后的要求 - 如果您只需使用dict初始化myDict,则可以从头开始从原始OrderedDict中删除这些值而不是dict,你需要做的就是替换它:

    myDict = {'key1': ['item1', 'item2', 'item3'], 'key2': ['item4', 'item5', 'item6'], 'key3': 'item7', 'key4': 'item8', 'key5': ['item1', 'item2', 'item3'], 'key6': 'item7'}
    

    用这个:

    from collections import OrderedDict
    
    …
    
    myDict = OrderedDict([('key1', ['item1', 'item2', 'item3']), ('key2', ['item4', 'item5', 'item6']), ('key3', 'item7'), ('key4', 'item8'), ('key5', ['item1', 'item2', 'item3']), ('key6', 'item7')])
    

    然后使用上面提供的相同代码。

答案 1 :(得分:0)

这样做:

myDict_values = myDict.values() # better than calling this numerous times
for key in myDict.keys():
    if myDict_values.count(myDict[key]) > 1: myDict[key] = ""

这不能保证key5为空而不是key1,因为字典不是订购的。