查找员工数据2D数组和部门数据2D数组之间的差距

时间:2014-06-25 16:17:12

标签: python arrays

嘿伙计我正在处理一个包含14列(部门ID,员工ID和一年中的几个月)的数据集,显示每个员工每个月工作的小时数。

我正在使用的功能需要为他/她的部门(作为一个整体)记录非零值(即营销中的John记录为零时)的特定月份记录零值的员工打印行。 5月份,当部门总计500小时,所以我们打印约翰的行。

我有两个辅助函数:cost_center_sum(A),它接收2D数据数组(按列表列表组织),并查找每个部门的累计小时数作为列表列表。第二个辅助函数compcols(row, A)与" row"的部门ID匹配。使用数据集A中的相应行并检查" row"中的零值。对于特定月份,对应于A中匹配的行中同一月份的零。

我尝试将这两个函数编译到函数findgaps(A)中,该函数打印一个员工的员工信息,该员工在一个月内记录一个非零值的零记录。

以下是我上述功能的代码:

def compcols(row, A):
for i in range(len(A)):
    if len(A[i]) < len(row):
        print row, (" - beware : line %d len(A[i]) %d < len(row) %d"
                    %(i, len(A[i]), len(row)))
    else:
        if row[0]==A[i][0]:
            for j in range(len(row)):
                if row[j]==0 and A[i][j]!=0:
                    print row
                    break


NUMBER_OF_MONTHS = 12
def cost_center_sum(A):
    dep = dict()
    for row in A:
        if row[0] not in dep:
            dep[row[0]] = [0.0 for x in xrange(NUMBER_OF_MONTHS)]
        for i in xrange(NUMBER_OF_MONTHS):
            dep[row[0]][i] += row[i+2]
    ret = list()
    for department in sorted(dep.iterkeys()):
        x = [department]
        x.extend(dep[department])
        ret.append(x)
    return ret

def findgaps(A):
    X=cost_center_sum(A)
    for i in range(len(A)):
        for j in range(len(A[0])):
            if A[i][j] < 0.00001:
                return compcols(A[i],X) 

我已经测试了其他功能,他们似乎做得很好(compcol中有一个小错误,它会多次打印出相同的行),但当我使用findgaps时功能,它提供了一个完全错误的输出,只有一个员工行打印80次:

[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0]  - beware : line 76 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0]  - beware : line 77 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0]  - beware : line 78 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0]  - beware : line 79 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0]  - beware : line 80 len(A[i]) 13 < len(row) 14

1 个答案:

答案 0 :(得分:1)

findgaps只会return一次;在第一次调用compcols之后,该功能结束:

def findgaps(A):
    X=cost_center_sum(A)
    for i in range(len(A)):
        for j in range(len(A[0])):
            if A[i][j] < 0.00001:
                return compcols(A[i],X) # only ever returns once

相反,它应该是这样的:

def findgaps(A):
    X = cost_center_sum(A)
    for row in A:
        if any(month < 0.00001 for month in row[2:]):
            yield compcols(row, X)

这是一个&#34;发电机&#34;这将返回多个值。请注意,您不需要索引ij - 它们只会使代码复杂化,您可以看到迭代对象本身时有多清楚。

接下来,compcols正在报告&#34;警告&#34;第一项是否匹配。我认为它应该是:

def compcols(row, X):
    for dept_row in X:
        if row[0] == dept_row[0]:
            for emp_month, dep_month in zip(row[2:], dept_row[2:])
                if emp_month == 0 and dep_month != 0:
                    return row
    else:
        print "No match for department {0}.".format(row[0])
相关问题