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

  • 本文关键字:Python 求和 字符 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个字符对任何一组键进行分组,因为这些分组在未来可能会发生变化。

您可以使用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}

您可以将codes中的所有项目转换为Counter,并将它们相加:

from collections import Counter
codes = {
    '113110': 7,    '113310': 1,    '213111': 1,
    '213112': 3,    '236115': 2,    '236220': 1,
    '238190': 1,    '238330': 1,    '238990': 2,
    '311612': 1,    '321214': 1
}
sum((Counter({k[:2]: v}) for k, v in codes.iteritems()), Counter()) # Counter({'11': 8, '23': 7, '21': 4, '32': 1, '31': 1})

最新更新