如何向尚不存在的键添加值?
我有一个字典,长得像这样:
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
测试的键值组合,将列表转换成集合(去掉重复的值),然后再转换回列表。对于其他的键值组合,它会保持不变。