查找2D数组中的数据不一致(Python)



嘿,伙计们,我正在处理一个数据集,它有14列(部门ID、员工ID和一年中的月份),显示每个员工每个月工作了多少小时。我正在使用的函数需要打印出在特定月份记录零值的员工的行,而他/她的部门(作为一个整体)记录了一个非零值(例如,市场部的John在5月份记录了零小时,而部门总数为500小时,因此我们打印John的行)。我有两个辅助函数: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):
        raise Exception("Line %d len(A[i]) %d - len(row) %d"
                        %(i, len(A[i]), len(row)))
    for j in range(len(row)):
        if row[0]==A[i][0]:
            if row[j]==0 and A[i][j]!=0:
                print row

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函数时,我得到以下错误:

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    findgaps(my_list)
  File "C:UsersnbhambiDesktopAmgenProgram.py", line 38, in findgaps
    return compcols(A[i],X)
  File "C:UsersnbhambiDesktopAmgenProgram.py", line 7, in compcols
    %(i, len(A[i]), len(row)))
Exception: Line 0 len(A[i]) 13 - len(row) 14

任何帮助都将非常感激!

编辑-问题要简单得多pub是由前面的post引起的错误

这一切都是愚蠢的混乱

所发生的是正常的:如果A[i]短于row, if len(A[i]) < len(row): raise Exception("...")精确地抛出错误。我想你宁愿节目继续下去。

所以你可以这样做(简单的警告而不是错误):

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

我还在最内层循环的末尾添加了一个断点,以便只打印一次row,并将测试row[0]==A[i][0]拉出该循环,以避免无用的测试。

回到实际解决方案

因为上面引用的帖子,我只试图修复异常问题。但是问题要简单得多:通过构造,cost_center_sum生成一个大小为13的列表,findgapscompcols将其与大小为14的列表进行比较!事实上,如果a中有一行没有14个值,那么在compcols之前调用的cost_center_sum中就会出现错误。

让所有的工作:

  • compcols应该只比较月份值,而不是内部循环中的第一个字段,并在它们所在的位置获取这些值:

    def compcols(row, A):
        for i in range(len(A)):
            if row[0]==A[i][0]:
                for j in range(1, len(row)):
                    if row[j]==0 and A[i][j + 1]!=0:
                        print row
                        break
    
  • findgaps应该在匹配后停止调用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:
                    compcols(A[i],X)
                    break
    

最新更新