在2D数组中按特定行标识符求列总和

2024-10-01 15:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个函数,如果每行中的第一个项与另一个匹配,则该函数会将2D数组的最后12列的值相加。每行的第一个元素表示部门ID号,因此我需要每个部门的员工每月工作的累计总小时数。我的2D数组是一个列表列表,数据示例如下所示:

[[12606.0, 74204.0, 56.0, 64.0, 72.0, 21.6, 18.0, 0.0, 0.0], 
 [12606.0, 105492.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6], 
 [12606.0, 112151.0, 2.4, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
 [12606.0, 121896.0, 0.0, 0.0, 0.0, 0.0, 0.0, 60.8, 0.0]]

我的代码如下:

   def costcentersum(A):
    """Finds the sum of the monthly hours worked by employees in each cost center.
    """
    for i in range(len(A)):
        if A[i-1][0] == A[i][0]:
            A[i][2:] += A[i-1][2:]
    print A[i]

不过,我的输出很奇怪,不是正确答案。我知道了:

[12606.0, 121896.0, 0.0, 0.0, 0.0, 0.0, 0.0, 60.8, 0.0, 0.0, 0.0, 8.0, 15.2, 18.4, 2.4, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6, 32.0, 54.4, 52.0, 56.0, 43.2, 56.0, 64.0, 72.0, 21.6, 18.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

我希望我的输出不包括数据的第二列(雇员ID)。只需简单的dep ID和每个月的累计小时数。我的代码哪里出错了?谢谢你的帮助!你知道吗


Tags: the数据函数代码inid元素示例
2条回答

线路

A[i][2:] += A[i-1][2:]

不会将所有列单独添加到上面的行,而是添加列表。这就是为什么你的输出看起来那么长。你知道吗

您的函数实际上没有任何有用的东西,它只是print的最后一行(只有最后一行,因为printfor循环之外)。此外,您的代码也不会试图说明成本中心在文件中不是连续的。你知道吗

更好的结构应该是字典,其中键是成本中心ID,值是所有行的最后12列的总和,其中第一列是该成本中心。你知道吗

def cost_center_sum(arr):
    out = {}
    for row in arr:
        cc = int(row[0])
        if cc not in out:
            out[cc] = [0] * 12
        out[cc] = list(map(sum, zip(out[cc], row[2:]))) # add by column
    return out

突出显示的行实际上是一列一列地求和。你知道吗

示例输入的输出:

{12606: [58.4, 68.0, 72.0, 21.6, 18.0, 60.8, 45.6]}

您可以使用defaultdict按ID号对所有行进行分组,使用comprehensionzip(*array)对列进行求和(这里有一个Live Ideone Example可以使用):

Python:

A = [[12606.0, 74204.0, 56.0, 64.0, 72.0, 21.6, 18.0, 0.0, 0.0], 
     [12606.0, 105492.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6], 
     [12606.0, 112151.0, 2.4, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
     [12606.0, 121896.0, 0.0, 0.0, 0.0, 0.0, 0.0, 60.8, 0.0],
     [12901.0, 74204.0, 25.0, 15.0, 45.0, 38.6, 18.0, 0.0, 0.0],
     [12901.0, 105492.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 45.6]]

from collections import defaultdict
d = defaultdict(list)
for row in A:                 
    d[row[0]].append(row[2:])   # append all rows with same ID number.

print {k:[sum(col) for col in zip(*rows)] for k, rows in d.items()}

输出:

{12606.0: [58.4, 68.0, 72.0, 21.6, 18.0, 60.8, 45.6],
 12901.0: [25.0, 15.0, 45.0, 38.6, 18.0, 0.0, 45.6]}

注意:使用zip(*rows)对行进行转置,以便按列求和。见this SO post。你知道吗

相关问题 更多 >

    热门问题