使用python字典时,避免keyError的最佳方法是什么?

使用python字典时,避免keyError的最佳方法是什么?,python,dictionary,Python,Dictionary,很明显,这会给我一个键错误,因为我在使用这个之前没有初始化键len(目标),len(源)。我知道我可以使用默认dict来避免这种错误,但我不确定在这种特殊情况下如何避免它。对于len(目标)和len(源),是否有防止键错误和增量值的方法 使用collections.defaultdict或collections.Counter。这三种方法中的任何一种都有效: for target, source ,in zip(self.tCorpus, self.fCorpus): #

很明显,这会给我一个键错误,因为我在使用这个之前没有初始化键
len(目标),len(源)
。我知道我可以使用默认dict来避免这种错误,但我不确定在这种特殊情况下如何避免它。对于
len(目标)和len(源)
,是否有防止键错误和增量值的方法

使用
collections.defaultdict
collections.Counter
。这三种方法中的任何一种都有效:

    for target, source ,in zip(self.tCorpus, self.fCorpus):
        #print(target, source)
        self.pairLength[len(target), len(source)] += 1
collections.Counter
的另一个优点是为您提供最常见的
self.pairLength(10)
,这可能对您的特定应用程序有用

如果出于任何原因无法使用新容器,请在执行任何操作之前确保密钥存在:

self.pairLength = collections.defaultdict(int)
self.pairLength = collections.defaultdict(lambda: 0)
self.pairLength = collections.Counter()
使用具有默认值param的get():
self.pairLength.get((len(target),len(source)),0)+=1
通常,我建议使用
setdefault
方法;它将键和默认值作为参数。如果找不到密钥,则会为其分配默认值,并返回该值。如果键确实存在,则忽略默认值并进行正常查找:

for target, source ,in zip(self.tCorpus, self.fCorpus):
    key = (len(target), len(source))

    if key not in self.pairLength:
        self.pairLength[key] = 0

    self.pairLength[key] += 1
在您的情况下,这不起作用,因为我们没有更改值,而是重新分配它。所以

a = {}
a.setdefault(7, []).append(1)
a
# {7: [1]}
a.setdefault(7, []).append(2)
a
# {7: [1, 2]}

get
setdefault
之间的区别在于,如果没有按键,get不会指定默认值。它总是让口述保持不变。但是,由于我们必须明确地重新分配——数字是不可变的——这在这里是合适的。

请提供一个答案。如果没有一些背景信息,您的变量和索引都没有任何意义。
a[key] = a.get(key, 0) + 1