填写字典而不使用try除外

时间:2016-02-24 20:42:31

标签: python dictionary try-catch

假设我有字典并且我想用一些键和值填充它,第一个字典是空的并且假设我需要这个字典用于计数器例如计算字符串中的一些键我有这样的方式:

myDic = {}
try :
    myDic[desiredKey] += 1
except KeyError:
    myDic[desiredKey] = 1

或者有时候值应该是一个列表,我需要将一些值附加到我有这种方式的值列表中:

myDic = {}
try:
    myDic[desiredKey].append(desiredValue)
except KeyError:
    myDic[desiredKey] = []
    myDic[desiredKey].append(desiredValue)

对于不使用try except部分的作品(两者都有),是否有更好的替代方案?

4 个答案:

答案 0 :(得分:3)

我建议collections.defaultdict

from collections import defaultdict
myDic = defaultdict(int)
myDic[key] = value

正如两位炼金术士所说的那样,关于defaultdict的最好的事情是当你需要多个值键时(而不必首先将值定义为列表)。再次使用d["key"] = value只会重置旧值,所以:

myDic = defaultdict(list)
for key in keys_list:
    myDic[key].append(value)

答案 1 :(得分:3)

您可以使用collections.defaultdict(),它允许您提供每次访问丢失密钥时都会调用的函数。

对于你的第一个例子,你可以将int作为缺失的函数传递给它,它将在第一次被访问时被评估为0。

对于第二个,您可以传递list

示例:

from collections import defaultdict 
my_dict = defaultdict(int)

>>> lst = [1,2,2,2,3] 
>>> for i in lst:
...      my_dict[i]+=1
... 
>>> 
>>> my_dict
defaultdict(<type 'int'>, {1: 1, 2: 3, 3: 1})
>>> my_dict = defaultdict(list)
>>> 
>>> for i,j in enumerate(lst):
...     my_dict[j].append(i)
... 
>>> my_dict
defaultdict(<type 'list'>, {1: [0], 2: [1, 2, 3], 3: [4]})

答案 2 :(得分:1)

执行此操作的最佳方法是使用python的优秀in

myDic = {}
if desiredKey in myDict:
    myDic[desiredKey] += 1
else:
    myDic[desiredKey] = 1

答案 3 :(得分:1)

试试这个:

myDic = {}
myDic['desiredKey'] = myDic.get('desiredKey', 0) + 1

类似于您的列表案例:

myDic = {}
myDic['desiredKey'] = myDic.get('desiredKey', []) + [desiredValue]

dict的.get方法将返回值并默认为None而不是抛出异常。您还可以将默认返回值指定为第二个参数.get(key, default)