如何向尚不存在的键添加值?

1 投票
3 回答
1044 浏览
提问于 2025-04-18 12:12

我有一个字典,长得像这样:

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:'

我知道这个错误是因为我试图把一个值添加到一个不存在的键上,但我不知道该怎么解决这个问题,让它正常工作。

3 个回答

1

如果你想去掉重复的元素,可以把你的列表转换成集合,使用 set() 函数就可以了:

https://docs.python.org/2/tutorial/datastructures.html#sets

这样就会自动得到一个不重复的集合,然后你可以随时把它再转换回列表。

2
dct = {'one': 'value', 
       'two': ['value1','value2','value1'], 
       'three':['otherValue1','otherValue2','otherValue1'],
       'dontCareAboutThisKey':'debug'}
for key, value in dct.items():
    if not isinstance(value, basestring):
        dct[key] = set(value)
new_dct = {}
for key, value in dct.items():
    if not isinstance(value, basestring):
        new_dct[key] = set(value)
    else:
        new_dct[key] = value

set(dct) 会返回一个 set,也就是一个没有重复项的列表:

如果你需要一个新的字典,你可以这样做:

3

我觉得同时添加键和附加值的最好方法是使用字典的 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 测试的键值组合,将列表转换成集合(去掉重复的值),然后再转换回列表。对于其他的键值组合,它会保持不变。

撰写回答