我有一本类似的字典(但更长):
codes = {
'113110': 7, '113310': 1, '213111': 1,
'213112': 3, '236115': 2, '236220': 1,
'238190': 1, '238330': 1, '238990': 2,
'311612': 1, '321214': 1, }
我想知道按前两位数分组的所有键的总和值。所以,' 11'应该是8.但如果我检查如下,发生了' 11'钥匙中的任何地方都会计算在内。
group_11 = sum([ v for k,v in codes.items() if '11' in k])
# Returns 15 instead of 8
我已尝试使用startswith
,但我不确定它在这种情况下是如何运作的。不是这样的:
group_11 = sum([ v for k,v in codes.items() if any(k.startswith('11')])
我有20个组要检查,但我希望能够按照前x个字符对任何一组密钥进行分组,因为将来可能会更改分组。
答案 0 :(得分:3)
您可以使用itertools.groupby
进行排序(排序对groupby
正常工作非常重要),并按前两个关键字符对您的dict
项进行分组每组的值:
from itertools import groupby
d = {
k: sum(item[1] for item in g)
for k, g in groupby(sorted(codes.items()), key=lambda item: item[0][:2])
}
d
{'11': 8, '32': 1, '31': 1, '21': 4, '23': 7}
答案 1 :(得分:0)
您可以将directive("showMyData",function(){
return {
restrict: "E",
scope: {
myData : "="
},
controller : ["$scope", function($scope){
$scope.message = ($scope.myData.indexOf("Honda") > -1 && $scope.myData.length >= 4) ? "1 out of 4 cars is always Honda": "OOPS, no honda cars";
$scope.$watchCollection(function(){
return $scope.myData;
}, function(new1, old){
$scope.message = ($scope.myData.indexOf("Honda") > -1 && $scope.myData.length >= 4) ? "1 out of 4 cars is always Honda": "OOPS, no honda cars";
});
}],
template : '<div>{{message}}</div><ul ng-repeat="data in myData"><li>{{data}}</li></ul>'
}
})
中的所有项目转换为https://[domain]/SP/AuthServices/SignIn并将它们汇总在一起:
codes