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)
的值?
答案 0 :(得分:2)
使用collections.defaultdict
或collections.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
get
和setdefault
之间的区别在于,在密钥未命中时,get不会分配默认值。它总是让dict保持不变。但是因为我们必须明确地重新分配 - 数字是不可变的 - 这在这里是合适的。