代码之家  ›  专栏  ›  技术社区  ›  user2966197

如何在python中进行运行求和?

  •  1
  • user2966197  · 技术社区  · 10 年前

    我有一份清单 Student 其具有以下结构:

    [('abc', 50000), ('def', 34000),....]
    

    这里,每个元组的第一个元素是员工ID,第二部分是工资。现在,我想做的是首先根据员工数量形成不同的桶。因此,桶将具有- 0-5 employees , 0-10 employees , 0-15 employees 等等。例如,如果我的列表中有32个员工数据,那么我的存储桶将是- 0-5名员工 , 0-10名员工 , 0-15名员工 , 0-20 employees , 0-25 employees , 0-30 employees 最后 0-32 employees 。每个桶都将是他们工资的相关金额。请注意,员工人数可能会有所不同,而且他们不需要是5名员工的完美组合。但我希望他们在5个员工差异的桶中,直到最后一个桶的差异可能小于5。

    到目前为止,我已经尝试过:

    count = 0
    increment = 5
    total_employees = 5
    run_salary = 0
    emp_bucket = []
    for items in List1:
        count += 1
        if count <= total_employees:
            run_salary += items[1]
        else:
            emp_bucket.append(run_salary)
            total_employees += increment
            count = 0
            run_salary = 0
    

    我知道这段代码不正确,因为当事情重新初始化时,流程应该从第一个员工开始,而不是从列表中的下一个员工开始。我的当前代码从下一个员工开始。 我现在很难用累积或运行信息来构建这种类型的存储桶。我如何形成这些桶?

    2 回复  |  直到 10 年前
        1
  •  1
  •   Ben    10 年前

    试试看:

    >>> data = [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051), ('BTYHr', 3367), ('AgEqM', 2804), ('ovgNh', 4548), ('AlTAn', 4817), ('vOYtV', 3291), ('vbTxW', 4740), ('rzcRq', 3259), ('ZAJpv', 3800), ('IVGDY', 1499), ('fvCDx', 4432), ('btuUD', 3844), ('fWJUi', 3973), ('nptHC', 4854), ('dbAxH', 1467), ('egeDs', 4514), ('ArvtJ', 4798), ('PGtEh', 1924), ('VkrIb', 1637), ('dbIpm', 1612), ('HShOu', 2425), ('cWZOG', 4286), ('cMESU', 3374), ('fcBpX', 3926), ('VWhFW', 4546), ('FLLmu', 2609), ('XrLEf', 3829), ('xaWZh', 1543)]
    >>> 
    >>> for group in [data[:i+5] for i in range(0, len(data), 5)]:
    ...     print group
    ...     print sum(x[1] for x in group)
    ...
    [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051)]
    14561
    [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051), ('BTYHr', 3367), ('AgEqM', 2804), ('ovgNh', 4548), ('AlTAn', 4817), ('vOYtV', 3291)]
    33388
    [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051), ('BTYHr', 3367), ('AgEqM', 2804), ('ovgNh', 4548), ('AlTAn', 4817), ('vOYtV', 3291), ('vbTxW', 4740), ('rzcRq', 3259), ('ZAJpv', 3800), ('IVGDY', 1499), ('fvCDx', 4432)]
    51118
    [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051), ('BTYHr', 3367), ('AgEqM', 2804), ('ovgNh', 4548), ('AlTAn', 4817), ('vOYtV', 3291), ('vbTxW', 4740), ('rzcRq', 3259), ('ZAJpv', 3800), ('IVGDY', 1499), ('fvCDx', 4432), ('btuUD', 3844), ('fWJUi', 3973), ('nptHC', 4854), ('dbAxH', 1467), ('egeDs', 4514)]
    69770
    [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051), ('BTYHr', 3367), ('AgEqM', 2804), ('ovgNh', 4548), ('AlTAn', 4817), ('vOYtV', 3291), ('vbTxW', 4740), ('rzcRq', 3259), ('ZAJpv', 3800), ('IVGDY', 1499), ('fvCDx', 4432), ('btuUD', 3844), ('fWJUi', 3973), ('nptHC', 4854), ('dbAxH', 1467), ('egeDs', 4514), ('ArvtJ', 4798), ('PGtEh', 1924), ('VkrIb', 1637), ('dbIpm', 1612), ('HShOu', 2425)]
    82166
    [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051), ('BTYHr', 3367), ('AgEqM', 2804), ('ovgNh', 4548), ('AlTAn', 4817), ('vOYtV', 3291), ('vbTxW', 4740), ('rzcRq', 3259), ('ZAJpv', 3800), ('IVGDY', 1499), ('fvCDx', 4432), ('btuUD', 3844), ('fWJUi', 3973), ('nptHC', 4854), ('dbAxH', 1467), ('egeDs', 4514), ('ArvtJ', 4798), ('PGtEh', 1924), ('VkrIb', 1637), ('dbIpm', 1612), ('HShOu', 2425), ('cWZOG', 4286), ('cMESU', 3374), ('fcBpX', 3926), ('VWhFW', 4546), ('FLLmu', 2609)]
    100907
    [('KgqZe', 4675), ('bFbad', 1279), ('oswIx', 2644), ('mEPlC', 2912), ('rnQGs', 3051), ('BTYHr', 3367), ('AgEqM', 2804), ('ovgNh', 4548), ('AlTAn', 4817), ('vOYtV', 3291), ('vbTxW', 4740), ('rzcRq', 3259), ('ZAJpv', 3800), ('IVGDY', 1499), ('fvCDx', 4432), ('btuUD', 3844), ('fWJUi', 3973), ('nptHC', 4854), ('dbAxH', 1467), ('egeDs', 4514), ('ArvtJ', 4798), ('PGtEh', 1924), ('VkrIb', 1637), ('dbIpm', 1612), ('HShOu', 2425), ('cWZOG', 4286), ('cMESU', 3374), ('fcBpX', 3926), ('VWhFW', 4546), ('FLLmu', 2609), ('XrLEf', 3829), ('xaWZh', 1543)]
    106279
    

    这会将数据分成5个递增的块,并将该组数据加上他们所有工资的总和。

    (注意:我使用了 random 库来生成数据,因此它看起来很奇怪)

    编辑

    要打印范围,只需更改打印语句:

    >>> for group in [data[:i+5] for i in range(0, len(data), 5)]:
    ...    print 'Group from 0 to', len(group)
    ...    print 'Sum:', sum(x[1] for x in group)
    ...
    Group from 0 to 5
    Sum: 14561
    Group from 0 to 10
    Sum: 33388
    Group from 0 to 15
    Sum: 51118
    Group from 0 to 20
    Sum: 69770
    Group from 0 to 25
    Sum: 82166
    Group from 0 to 30
    Sum: 100907
    Group from 0 to 32
    Sum: 106279
    
        2
  •  1
  •   VHarisop    10 年前

    与Ben的回答类似:

     # function to sum a list of (string, int) tuples
     fsum = lambda x: sum(i[1] for i in x)
    
     buckets = [fsum(salaries[:i]) for i in range(5, len(salaries), 5)]
    
    推荐文章