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

时间:2017-12-08 03:36:21

标签: python dictionary

public class Temp
{
    public string firstNumber { get; set; }
    public string secondNumber { get; set; }
    public string sum { get; set; }
}

public class AdditionController : ApiController
{
    private RestfulClient restfulClient = new RestfulClient();
    public async Task<IHttpActionResult> Get(int firstNumber, int secondNumber)
    {
        var result = await restfulClient.addition(firstNumber, secondNumber);
        var resultDTO = JsonConvert.DeserializeObject<Temp>(result);
        return Json(resultDTO);
    }
}

很明显,这会给我一个关键错误,因为我在使用之前没有初始化密钥 for target, source ,in zip(self.tCorpus, self.fCorpus): #print(target, source) self.pairLength[len(target), len(source)] += 1 。我知道我可以使用默认的dict来避免这种错误,但我不知道在这种特殊情况下如何避免它。有没有办法阻止keyerror并增加len(target), len(source)的值?

3 个答案:

答案 0 :(得分:2)

使用collections.defaultdictcollections.Counter。这三个中的任何一个都可以工作:

self.pairLength = collections.defaultdict(int)
self.pairLength = collections.defaultdict(lambda: 0)
self.pairLength = collections.Counter()

collections.Counter具有为您提供self.pairLength.most_common(10)的额外优势,这可能对您的特定应用有用。

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

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

答案 1 :(得分:0)

将get()与默认值param一起使用: self.pairLength.get((len(target), len(source)),0)+=1

答案 2 :(得分:0)

通常,我会推荐setdefault方法;它将键和默认值作为参数。如果未找到密钥,则会为其分配默认值,并且还会返回该值。如果密钥确实存在,则忽略默认值并进行正常查找:

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

在您的情况下不起作用,因为我们没有更改值但重新分配它。因此

a[key] = a.get(key, 0) + 1

getsetdefault之间的区别在于,在密钥未命中时,get不会分配默认值。它总是让dict保持不变。但是因为我们必须明确地重新分配 - 数字是不可变的 - 这在这里是合适的。