我有一本这样的字典:

dct = {'one': 'value',
       'two': ['value1','value2','value1'],
       'three':['otherValue1','otherValue2','otherValue1'],
       'dontCareAboutThisKey':'debug'}


我需要从列表中删除重复的值。我写了一个函数来做到这一点:

no_dups = {}
    for keys in dct:
        if isinstance(dct[keys], list) and keys != 'dontCareAboutThisKey':
            for value in dct[keys]:
                if value not in no_dups.values():
                    no_dups[keys].append(value)
        else:
            no_dups[keys] = dct[keys]


我正在检查当前键的值是否为列表。如果否,则只需将键“复制”到no_dups词典。如果它是一个列表而不是我不在乎的键(肯定没有重复项)-它应该检查no_dups.values()中是否已存在当前值,并将其附加到当前键中。问题是我遇到错误:

KeyError: 'two:'

我知道这是因为我正在尝试为不存在的键添加一个值,但是我不知道如何处理并使其起作用。

最佳答案

我认为最好同时处理添加键和追加的方法是使用dicts的setdefault()方法:

no_dups.setdefault(keys,[]).append(value)


但是,除此以外,您可以像这样更整洁地执行此操作:

#remove duplicates
no_dups = {k:list(set(v)) if isinstance(v, list) and k != 'dontCareAboutThisKey' else v
           for k,v in dct.items()}  # or dct.iteritems() if using python2.x


对于通过if测试的键值组合,该hack将把该列表转换为一组(删除重复项),然后再次在列表中。对于其他键值组合,它将保持原样。

关于python - 如何将值 append 到尚不存在的键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24586974/

10-12 16:41