按键前X个字符的和值(Python)

时间:2016-05-02 15:52:16

标签: python

我有一本类似的字典(但更长):

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个字符对任何一组密钥进行分组,因为将来可能会更改分组。

2 个答案:

答案 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