我正在尝试创建一个函数,如果每行中的第一项与另一行匹配,则该函数会添加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和每个月的累积小时数。我的代码在哪里出错?谢谢你的帮助!
答案 0 :(得分:1)
该行
A[i][2:] += A[i-1][2:]
不将所有列分别添加到上面的行中,添加列表; [1, 2] + [3, 4] == [1, 2, 3, 4]
。这就是你的输出看起来那么久的原因。
您的函数实际上并不return
有用,只有print
是最后一行(只有最后一行,因为print
在for
循环之外) 。此外,您的代码不会尝试考虑文件中不连续的成本中心。
更好的结构是字典,其中键是成本中心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]}
答案 1 :(得分:1)
您可以使用defaultdict按ID号对所有行进行分组,使用comprehension和zip(*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。